2017-03-21 5 views
0

私はこの些細な質問はしていますが、何も私にとってはうまくいかない:/ viewmodelからデフォルトの選択コンボボックスの値を設定しようとしています。 ViewModelにはデフォルトの選択値を持つWPF MVVM ComboBox

public class ItemFilter 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

:ビューで

public MainViewModel() 
{ 
    SelectedItemFilter = ItemFilters[0]; 
} 

public IList<ItemFilter> ItemFilters 
{ 
    get 
    { 
     IList<ItemFilter> itemFilter = new List<ItemFilter>(); 
     itemFilter.Add(new ItemFilter() { Id = 0, Name = "All" }); 
     itemFilter.Add(new ItemFilter() { Id = 1, Name = "One" }); 
     itemFilter.Add(new ItemFilter() { Id = 2, Name = "Two" }); 
     return itemFilter; 
    } 
} 

public ItemFilter SelectedItemFilter 
{ 
    get { return _selectedItemFilter; } 
    set { SetProperty(ref _selectedItemFilter, value); } 
} 

:私は何をしないのです

<DataGrid x:Name="DataGridItems" 
       EnableRowVirtualization="True" 
       ItemsSource="{Binding ItemCollection}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Foo" Binding="{Binding Path=SizeComment}" IsReadOnly="True" Width="120"> 
      <DataGridTextColumn.HeaderTemplate> 
       <DataTemplate> 
        <ComboBox ItemsSource="{Binding DataContext.ItemFilters, RelativeSource={RelativeSource AncestorType=Window}}" 
            SelectedItem="{Binding DataContext.SelectedItemFilter, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}" 
            DisplayMemberPath="Name" /> 
       </DataTemplate> 
      </DataGridTextColumn.HeaderTemplate> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

ここでは、コードですか?

答えて

2

最初の明らかな理由は、すべての要求でItemFiltersが作成されていることです。したがって、SelectedItemFilter = ItemFilters[0];はフィルタのリストを作成し、最初のフィルタをSelectedItemFilterに割り当てます。 ComboBoxがフィルターのリストを要求すると、の異なるフィルターのリストを取得します。だからSelectedItemFilterComboBoxアイテムリストに見つかりません。 2つのソリューションがあります。

  1. コンストラクタ内でItemFiltersを一度実装する方が良いでしょう。
  2. 1が適用されない場合@Zbigniewは、プロパティのゲッターに新しいリストを作成することは悪い考えであることを示唆しているとして、その後ItemFilterクラス
1

Equals()GetHashCode()をオーバーライドします。

あなた MainViewModelのコンストラクタが1 List<ItemFilter>を作成し、この1で最初 ItemFilterオブジェクトへ SelectedItemFilterを設定し、ビューに結合が解決されたときに作成、別の List<ItemFilter>とになりません SelectedItemFilterインスタンスが存在しますでしょう

この新しいリストだからあなたはComboBoxで選択されたアイテムを手に入れません。

public MainViewModel() 
{ 
    IList<ItemFilter> itemFilter = new List<ItemFilter>(); 
    itemFilter.Add(new ItemFilter() { Id = 0, Name = "All" }); 
    itemFilter.Add(new ItemFilter() { Id = 1, Name = "One" }); 
    itemFilter.Add(new ItemFilter() { Id = 2, Name = "Two" }); 
    ItemFilters = itemFilter; 

    SelectedItemFilter = itemFilter[0]; 
} 

public IList<ItemFilter> ItemFilters { get; } 

public ItemFilter SelectedItemFilter 
{ 
    get { return _selectedItemFilter; } 
    set { SetProperty(ref _selectedItemFilter, value); } 
} 

あなたはソースコレクション一度に作成する必要があります

関連する問題