从后面的代码更新ComboBox SelectedItem

时间:2011-11-30 17:49:33

标签: c# wpf mvvm

我有一个带有ComboBox的视图绑定到我的viewModel属性。 一切正常,但我真的想重用我的视图和需要 使用给定值更新控件。设置属性不会更新可视UI 即使事件被解雇,每一个看起来都很好。

一切正常,接受ComboBox可视化UI。

提示?!

XAML控制

<telerik:RadComboBox 
            ItemTemplate="{StaticResource SelectUserComboBoxTemplate}"
            SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay,
            UpdateSourceTrigger=PropertyChanged}" 
            ItemsSource="{Binding Path=C_users}" 
            telerik:TextSearch.TextPath="displayName"
            Name="radComboBox1" 
            Margin="14,12,0,0" 
            Height="31" 
            VerticalAlignment="Top" 
            HorizontalAlignment="Left" 
            Width="253" 
            TextSearchMode="Contains"
            IsEditable="True"
            OpenDropDownOnFocus="True" 
            IsFilteringEnabled="True"
            >
    </telerik:RadComboBox>

设置值

的重载构造函数
    public TicketControlTabViewModel(ticket t)
    {
        activeTicket = t;
        SelectedUser = customerServiceClient.getUser(t.customer_users.id);
        MetaString = t.meta;
        Description = t.description;
        ActiveId = t.id.ToString();
        Selected_priority = t.priority;
        SelectedStatus = t.status;
        this.RefreshC_users();
        this.RefreshSupportDepartments();
        this.RefreshSupportUsers();
    }

我的ViewModel中的属性

    private customer_users selectedUser { get; set; }
    public customer_users SelectedUser
    {

        get {
            return this.selectedUser;
            }
        set {
              if (value != null){
              this.selectedUser = value;
              this.UpdateCustomerDepartment(value);
              this.OnPropertyChanged("SelectedUser");
              SaveTicket();
              }

            }
    }

2 个答案:

答案 0 :(得分:2)

默认情况下,WPF按引用比较SelectedItem,而不是按值。这意味着如果SelectedItemItemsSource中的项目不完全相同,那么比较将返回false并且该项目不会被选中。

例如,这可能不起作用

MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = DAL.GetUser(1);
然而,这会:

MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = MyCollection.FirstOrDefault(p => p.Id == 1);

那是因为第二个例子将SelectedUser设置为MyCollection中实际存在的项目,而第一个例子可能没有。即使数据相同,它们也会在内存中引用不同的对象。

如果您选择的项目未在ItemsSource项目中引用内存中的相同项目,则使用SelectedValueSelectedValuePath绑定ComboBox的默认选项,或覆盖.Equals()如果被比较的对象中的数据相同,则类的方法返回true。

public override bool Equals(object obj)
{
    if (obj == null || !(obj == MyClass))
        return false; 

    return ((MyClass)obj).Id == this.Id);
}

答案 1 :(得分:1)

如果您不Items集合不包含等于SelectedItem的项目,则可能会发生这种情况。检查您是否有这样的项目(可能是您忘记在课程中重载Equals并且它使用参考比较)