具有默认选定值的WPF MVVM ComboBox

时间:2017-03-21 20:24:07

标签: c# wpf xaml mvvm combobox

我有这个微不足道的问题,但没有什么对我有用:/ 我试图从viewmodel设置默认选定的组合框值。这是代码:

#menu li ul{
    display: none;
}
#menu li:hover>ul{
    display: block;
    position: absolute;
    width: 100%;
}

在ViewModel中:

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); }
}

我缺少什么?

2 个答案:

答案 0 :(得分:2)

第一个明显的原因是每个请求都会创建ItemFilters。因此SelectedItemFilter = ItemFilters[0];会创建一个过滤器列表,然后将第一个过滤器分配给SelectedItemFilter。当ComboBox请求过滤器列表时,它会获得不同的过滤器列表。因此,在SelectedItemFilter项目列表中找不到ComboBox。有两种解决方案:

  1. 更好的一个 - &gt;在构造函数中设置一次ItemFilters。
  2. 如果1.不适用,请覆盖Equals()班级中的GetHashCode()ItemFilter

答案 1 :(得分:1)

正如@Zbigniew建议在财产的getter中创建一个新的List是一个坏主意。

MainViewModel的构造函数会创建一个List<ItemFilter>并将SelectedItemFilter设置为此ItemFilter个对象,然后会有另一个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); } } 中选择任何项目。

您应该创建源集合一次

Permit_list test_permit_list;

@Test
public void testAddPermit(){
    Permit p = new Permit();
    test_permit_list.add("test", p);
    assertEquals(p, test_permit_list.get("test");
}