[英]WPF MVVM ComboBox with default selected value
我有一个琐碎的问题,但对我没有任何作用:/我正在尝试从viewmodel设置默认的选定组合框值。 这是代码:
public class ItemFilter
{
public int Id { get; set; }
public string Name { get; set; }
}
在ViewModel中:
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>
我想念什么?
第一个明显的原因是在每个请求上都创建了ItemFilters
。 因此, SelectedItemFilter = ItemFilters[0];
创建一个过滤器列表,然后将第一个分配给SelectedItemFilter
。 当ComboBox请求过滤器列表时,它将获得不同的过滤器列表。 因此,在ComboBox
项列表中找不到SelectedItemFilter
。 有两种解决方案:
ItemFilter
类中的Equals()
和GetHashCode()
正如@Zbigniew所建议的那样,在属性的getter中创建一个新List是一个坏主意。
MainViewModel
的构造函数将创建一个List<ItemFilter>
,并将SelectedItemFilter
设置ItemFilter
对象中的第一个ItemFilter
对象,然后在解析视图中的绑定且SelectedItemFilter
实例不会解析时,将创建另一个List<ItemFilter>
在这个新列表中。 这就是为什么您没有在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); }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.