TheBigBearNow Ответов: 2

Combobox заполняется из datatable select выбранный элемент


Привет всем, у меня есть простой вопрос, Ну, это просто, вероятно, для большинства из вас, но по какой-то причине у меня не было ничего, кроме проблем с его выяснением.
У меня есть combobox, который заполнен datatable объекта с 2 свойствами. Я хотел бы получить значение одного из свойств, когда я выбираю определенный элемент в поле со списком. Вот мой класс и код, который создает datatable и xaml.
private void BindComboBoxStates()
        {
            DataView dataview = dataSetStates.Tables[0].DefaultView;
            ComboboxState.ItemsSource = dataview;
            ComboboxState.DisplayMemberPath = dataSetStates.Tables[0].Columns["Name"].ToString();
            ComboboxState.SelectedValuePath = dataSetStates.Tables[0].Columns["Abbreviations"].ToString();            
        }
        private void CreateDataTableStates()
        {
            DataTable dataTableStates = new DataTable("States");
            dataTableStates.Columns.AddRange(new DataColumn[]
            {
                new DataColumn("Name", typeof(string)),
                new DataColumn("Abbreviations", typeof(string))
            });

            foreach(US_State st in StateArray.States())
            {
                dataTableStates.Rows.Add(st.Name);
            }
            dataSetStates.Tables.Add(dataTableStates);
        }
<ComboBox x:Name="ComboboxState" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" Width="120" HorizontalAlignment="Left" ToolTip="Enter your state."
                          />
            <!--      ItemsSource="{Binding Path=states}" DisplayMemberPath="Name" SelectedValuePath="Abbreviations"       -->
//And here is where I have been trying to select the item
//var state = ComboboxState.SelectedValue;//ComboboxState.SelectedValue.ToString();
                                //var state = ((ComboBoxItem)ComboboxState.SelectedItem).Content.ToString();
                                // as ComboBoxItem)//.GetValue.ToString();
                                var cb = (sender as ComboBox);
                                var selectedItem = (cb.SelectedItem as DataRowView);
                                //cb.SelectedItem["Abbreviations"].ToString();


Что я уже пробовал:

перепробовал множество способов получить выбранное значение

//var state = ComboboxState.SelectedValue;//ComboboxState.SelectedValue.ToString();
                                //var state = ((ComboBoxItem)ComboboxState.SelectedItem).Content.ToString();
                                // as ComboBoxItem)//.GetValue.ToString();
                                var cb = (sender as ComboBox);
                                var selectedItem = (cb.SelectedItem as DataRowView);
                                //cb.SelectedItem["Abbreviations"].ToString();

2 Ответов

Рейтинг:
5

M.Kamran Asim

Основываясь на вашем комментарии. после практики

public class US_State : System.ComponentModel.INotifyPropertyChanged
  {
      string name;
      string abbreviations;
      public string Name { get { return name; } set { name = value; RaisePropertyChanged(); } }

      public string Abbreviations { get { return abbreviations; } set { abbreviations = value; RaisePropertyChanged(); } }

      public event PropertyChangedEventHandler PropertyChanged;
      private void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name="")
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
      }
  }

Примечание: в вашем случае вам не нужен INotifyPropertyChange для US_State. Я добавил его, если вам понадобится 2-полосная привязка в будущем. Вы можете создать свойства плана, как вы это сделали

Теперь все готово. Создать ObservableCollection или список Us_State в модель представления (если вы, используя шаблон MVVM). для простоты я создам список в коде позади like

private List<US_State> usStates;
       public List<US_State> USStates
       {
           get
           {
               return usStates;
           }
           set
           {
               usStates = value;
               RaisePropertyChanged();
           }
       }

Теперь назначьте USStates = StateArray.states; но сделайте состояния общедоступными в вашем статическом классе. Теперь окончательные и обязательные к исполнению немного сложно
Как и в этом примере, я объявил UsStates в коде windows/user controls позади, поэтому вы должны направлять combobox, который связывает itemssource с USStates, который помещается внутри userControl. (По умолчанию все элементы управления контентом заглядывают в datacontext)

взгляните на следующий xaml
<ComboBox Name="cmboTest"
                 ItemsSource="{Binding USStates, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, UpdateSourceTrigger=PropertyChanged}"
                 DisplayMemberPath="Name" SelectedValuePath="Abbreviations" SelectionChanged="cmboTest_SelectionChanged"/>


TheBigBearNow

хочу ли я поставить
"частный список<us_state> usStates;
публичный список<us_state> USStates
{
получить
{
верните usStates;
}
набор
{
usStates = значение;
RaisePropertyChanged();
}
}"

в моем окне WPF? или это тоже относится к классу US_State
У меня весь класс сделан как ты
я просто не уверен, должен ли я создать новый список<us_state> В моем окне WPF или я должен использовать это свойство

M.Kamran Asim

В приведенном выше примере я поместил его в код позади вашего окна/userControl. Похоже, вы используете окно. Поэтому объявите публичную собственность USStates в коде окна позади.
а по методу загрузки окна заполните это свойство.
Если вы проверите привязку xaml combobox, то он говорит
Привязка к штатам США, которая, конечно же, является государственной собственностью, но
Найдите в relatvie source, которым я руководствовался как типом окна, и найдите этот тип в Ancestor. это означает, что в документе xaml ищите его родителя, пока не дойдете до типа окна, а затем ищите proerty USStates .
Наконец, я упомянул как UpdateSourceTrigger=PropertyChanged. значит, если свойство изменилось, то триггер, так что я могу обновить.
Поэтому, когда вы устанавливаете USStates при загрузке windows, чаги будут автоматически отражаться в источнике элементов.

Но я предложу вам потратить некоторое время на MVVM (Mvvmlight-это очень простой и базовый пакет)

TheBigBearNow

Спасибо! Я сделал отдельный класс US_States, как у вас, и под этим классом внизу я сделал публичный статический класс StatesArray
а в классе statesarray в конструкторе у меня есть
состояния.Добавить(новый US_State("Вайоминг", "Вайоминг"));
и это в самом низу
публичный статический US_State[] AllFiftyStates()
{
возвращение состояний.Метод toArray();
}
Я могу сделать это в окне WPF
частный список<us_state> Get_States = StatesArray.states;
и combobox { привязка Get_States }

это все правильно?

Рейтинг:
12

M.Kamran Asim

проверьте свой цикл foreach. Вы не добавляете аббревиатуры в DataRow

 foreach(US_State st in StateArray.States())
            {
                dataTableStates.Rows.Add(st.Name); 
//this should bedataTableStates.Rows.Add(st.Name,st.Abbrivation);
            }


Теперь при изменении выделения, в свойство selecteditem вы можете получить имя + abbrivation или вы можете получить SelectedValue


TheBigBearNow

Спасибо !!
Есть ли простой способ привязать это к полю со списком с помощью IEnumerable и INotifyChange
[код]
US_State открытый класс
{
public string Name { get; set; }

общественного строка аббревиатуры { получить; набор; }

общественные US_State()
{
Имя = null;
Аббревиатуры = null;
}

public US_State(строка ab, имя строки)
{
Имя name;
Аббревиатуры = ab;
}

public override string ToString()
{
возвращенная строка.Формат("{0} - {1}", Аббревиатуры, Наименование);
}
}
//КЛАСС СТАТИЧЕСКОГО МАССИВА, СОДЕРЖАЩИЙ ВСЕ ДАННЫЕ СОСТОЯНИЯ.
публичный статический класс StateArray
{
статический список состояний & lt;us_state> ;

статический StateArray()
{
состояния = новый список<us_state>(50);
состояния.Добавить(new US_State("AL", "Alabama"));
состояния.Добавить(new US_State("AK", "Alaska"));
состояния.Добавить(new US_State("AZ", "Arizona"));
состояния.Добавить(new US_State("AR", "Arkansas"));
состояния.Добавить(новый US_State("Калифорния", "Калифорния"));
состояния.Добавить(new US_State("CO", "Colorado"));
состояния.Add(new US_State("CT", "Connecticut"));
состояния.Add(new US_State("DE", "Delaware"));
состояния.Добавить(new US_State("DC", "District Of Columbia"));
состояния.Добавить(новый US_State("Флорида", "Флорида"));
состояния.Добавить(new US_State("GA", "Georgia"));
состояния.Добавить(new US_State("привет", "Гавайи"));
состояния.Добавить(новый US_State("идентификатор", "Айдахо"));
состояния.Add(new US_State("IL", "Illinois"));
состояния.Добавить(new US_State("IN", "Indiana"));
состояния.Добавить(new US_State ("IA", "Iowa"));
состояния.Добавить(new US_State("KS", "Kansas"));
состояния.Добавить(новый US_State("Кентукки", "Кентукки"));
состояния.Добавить(new US_State("LA", "Louisiana"));
состояния.Добавить(new US_State("ME", "Maine"));
состояния.Добавить(new US_State("MD", "Maryland"));
состояния.Add(new US_State("MA", "Massachusetts"));
состояния.Добавить(new US_State("MI", "Michigan"));
состояния.Добавить(новый US_State("Миннесота", "Миннесота"));
состояния.Add(new US_State ("MS", "Mississippi"));
состояния.Добавить(new US_State("MO", "Missouri"));
состояния.Добавить(new US_State("MT", "Montana"));
состояния.Добавить(новый US_State("Небраска", "Небраска"));
состояния.Добавить(new US_State("NV", "Nevada"));
состояния.Добавить(новый US_State("Нью-Хэмпшир", "Нью-Гемпшир"));
состояния.Добавить(новый US_State("Нью-Джерси", "Нью-Джерси"));
состояния.Добавить(new US_State("NM", "New Mexico"));
состояния.Добавить(новый US_State("Нью-Йорк", "Нью-Йорк"));
состояния.Добавить(new US_State("NC", "North Carolina"));
состояния.Добавить(new US_State("ND", "North Dakota"));
состояния.Добавить(new US_State("OH", "Ohio"));
состояния.Добавить(новый US_State("ОК", "Оклахома"));
состояния.Добавить(new US_State("OR", "Oregon"));
состояния.Добавить(new US_State("PA", "Pennsylvania"));
состояния.Добавить(new US_State ("RI", "Rhode Island"));
состояния.Добавить(new US_State("SC", "South Carolina"));
состояния.Добавить(new US_State("SD", "South Dakota"));
состояния.Добавить(new US_State("TN", "Tennessee"));
состояния.Добавить(новый US_State("Техас", "Техас"));
состояния.Добавить(new US_State("UT", "Utah"));
состояния.Добавить(новый US_State("Вт", "Вермонт"));
состояния.Добавить(new US_State("VA", "Virginia"));
состояния.Добавить(новый US_State("Вашингтон", "Вашингтон"));
состояния.Добавить(новый US_State("Вирджиния", "Западная Виргиния"));
состояния.Добавить(новый US_State("Висконсин", "Висконсин"));
состояния.Добавить(новый US_State("Вайоминг", "Вайоминг"));
}

публичная статическая строка[] аббревиатуры()
{
List<string> abbrevList = новый список<string>(состояния.Рассчитывать);
по каждому элементу (ВАР государство в государств)

CHill60

Вместо того чтобы добавлять дополнительное решение (что сбивает с толку - какое именно решение вы собираетесь использовать?), используйте ссылку "улучшить решение" и обновите его таким образом