2016-08-15 2 views
0

У меня есть один ObservableCollection<M> fooBar {get;set;}. Класс M.cs выглядит следующим образом:DropDown привязывается к именам свойств; основанный на первом наборе второй привязки DropDown

public class M{ 
    private int _ID; 
    public int ID { 
     get {return this._ID;} 
     set {this._ID = value;} 
    } 

    private string _number; 
    public int Number { 
     get {return this._number;} 
     set {this._number = value;} 
    } 

    private string _power; 
    public int Power { 
     get {return this._power;} 
     set {this._power = value;} 
    } 

    /* 
     ... 
    */ 
} 

Теперь я хочу, чтобы связать имена этих 3 propertys к ComboBox. Я не хочу делать это так:

<ComboBox> 
    <ComboBoxItem>ID</ComboBoxItem> 
    <ComboBoxItem>Number</ComboBoxItem> 
    <ComboBoxItem>Power</ComboBoxItem> 
</ComboBox> 

Есть ли более удобный способ?

Основываясь на выборе первого ComboBox Я хочу заполнить второй ComboBox. В качестве примера я выбрал в первом ComboBox свойства Number то второй ComboBox должен выглядеть следующим образом

<ComboBox 
    SelectedValue="{Binding ???}" 
    ItemsSource="{Binding fooBar}" 
    SelectedValuePath="Number" 
    DisplayMemberPath="Number" 
    /> 

Может быть кто-то из вас может помочь мне, потому что я понятия не имею, как подключить оба выпадающие списки.

ответ

1

Это, как я хотел бы сделать это:

  • Сделайте свойство на модели представления, которая выставляет свойства на модели (класс М), которые могут быть выбраны. Таким образом, вы четко определяете, какие свойства могут быть выбраны.

  • Сделайте свойство удерживать выбранное значение каждого поля со списком.

  • DisplayMemberPath/SelectedValuePath в ComboBox2 связывается с SelectedValue ComboBox1.

ViewModel:

 // ComboBox 1 
     public Dictionary<string, string> SelectableProperties = new Dictionary<string, string>() 
     { 
      { nameof (M.ID), "ID" } 
      { nameof (M.Number), "Nummer" } 
      { nameof (M.Power), "Potenz" } 
     } 

     // Selection in combobox 1 (not strictly necessary as it can be handled in view, but you may need to know what SelectedValue represents) 
     private string _selectedValueMember = String.Empty; 
     public string SelectedValueMember 
     { 
      get { return _selectedValueMember; } 
      set { _selectedValueMember = value; } 
     } 

     // Selection in combobox 2 (object just in case there could be other values than int) 
     private object _selectedValue = null; 
     public object SelectedValue 
     { 
      get { return _selectedValue; } 
      set { _selectedValue = value; } 
     } 

     public ObservableCollection<M> FooBar{ get; set; } 

Вид:

<ComboBox x:Name="ComboBox1" 
        Width="100" 
        Margin="5" 
        SelectedValuePath="Key" 
        DisplayMemberPath="Value" 
        SelectedValue="{Binding SelectedValueMember}" 
        ItemsSource="{Binding SelectableProperties}"> 

     </ComboBox> 
     <ComboBox Width="100" 
        Margin="5" 
        DisplayMemberPath="{Binding ElementName=ComboBox1, Path=SelectedValue}" 
        SelectedValuePath="{Binding ElementName=ComboBox1, Path=SelectedValue}" 
        SelectedValue="{Binding SelectedValue}" 
        ItemsSource="{Binding FooBar}"> 

     </ComboBox> 
+0

Спасибо за ответ @sondergard! У меня есть одна проблема. Я не хочу показывать все свойства, и я хочу перевести их на немецкий язык. Как я могу это сделать? – MyNewName

+1

Локализация может быть выполнена с использованием словаря, где часть значения является локализованным текстом, и с выбранным значениемvaluepath/displaymemberpath указывают на ключ/значение соответственно. Я обновил образец с моим лучшим предположением в соответствии с моим воспоминанием о нем (это было, что, 15 лет?) :) Конечно, вы можете использовать строки из ресурса, если хотите. – sondergard

+0

спасибо большое! Теперь это работает. Никогда не использовался 'Словарь' для. ^^ – MyNewName

1

Для 1-го ComboBox: используйте Reflection, чтобы получить имена всех свойств класса M и поместить их в ComboBox.

Для второго ComboBox: при изменении выбора в 1-м, вы получите имя свойства. Теперь установите привязку SelectedValue к свойству, которое было выбрано в первом ComboBox.

Смежные вопросы