繁体   English   中英

WPF MVVM ComboBox具有默认选定值

[英]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 有两种解决方案:

  1. 一个更好的-在构造函数中一次将ItemFilters设为无效。
  2. 如果1.不适用,则重写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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM