源更改时,Combobox SelectedItem不会更新

时间:2010-08-17 04:17:19

标签: wpf mvvm binding combobox selecteditem

我有一个实现INotifyPropertyChanged的viewmodel。在此viewModel上是一个名为SubGroupingView的属性。此属性绑定到组合框的选定项。当我更改组合框时,源属性正在更新,但是当我更改源属性或初始化控件时,combobox.selectedItem不反映属性中存在的内容。
以下是一些可以帮助您入门的代码:

<ComboBox Grid.Column="3" Grid.Row="1" 
          Margin="0,1,4,1" 
          SelectedItem="{Binding Path=SubGroupingView, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}" 
          ItemsSource="{Binding Columns}" 
          DisplayMemberPath="DisplayName">

该属性引发PropertyChanged事件,TraceSource输出显示绑定检测到它并传输了值,只是组合框没有反映它。任何想法都会受到欢迎!

编辑:
跟踪源的输出是:

System.Windows.Data Warning: 91 : BindingExpression (hash=23631369): Got PropertyChanged event from ReportViewModel (hash=52844413)  
System.Windows.Data Warning: 97 : BindingExpression (hash=23631369): GetValue at level 0 from ReportViewModel (hash=52844413) using RuntimePropertyInfo(SubGroupingView):         DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 76 : BindingExpression (hash=23631369): TransferValue - got raw value DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 80 : BindingExpression (hash=23631369): TransferValue - implicit converter produced DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 85 : BindingExpression (hash=23631369): TransferValue - using final value DataColumnViewModel (hash=58231222)  

以下是source属性的代码:

public class ReportViewModel : ViewModelBase, IReportTemplate
{
    public DataColumnViewModel SubGroupingView
    {
        get
        {
            return GetViewModel(_report.SubGrouping);
        }
        set
        {
            if (_report.SubGrouping == value.ColumnName)
                return;
            _report.SubGrouping = value.ColumnName;
            RefreshDataSeries();
            base.OnPropertyChanged("SubGroupingView");
            base.OnPropertyChanged("IsReady");
        }

    }
}

注意:ViewModelBase实施INotifyPropertyChange

ANSWER
我重载了==,!=运算符,GetHashCode()Equals(object),现在它运行得很好。感谢您的所有帮助!

3 个答案:

答案 0 :(得分:16)

从SubGroupingView返回的对象必须与ComboBox.Items中的一个对象“相等”(这意味着它必须位于Columns集合中)。因此,如果您执行“a.Equals(b)”,则需要返回true。

如果它们在功能上相同,但在比较时没有返回true那么这就是你的问题。您需要返回相同的对象,或者覆盖Equals方法(可能还有==和!=运算符)。

如果这是您的问题,则问题与此question中的问题相同。

答案 1 :(得分:3)

IsSynchronizedWithCurrentItem上的ComboBox可能设置为false吗?您可以尝试明确设置IsSynchronizedWithCurrentItem="True",看看是否有帮助。

答案 2 :(得分:0)

@CodeNaked的答案是对的。但在我的情况下,只是重写Object.Equals会抛出StackOverflowException。我认为整个答案是实现完整的IEquatable,这意味着实现其Equals方法并覆盖this example中的Object.Equals(Object)和Object.GetHashCode方法(参见&#34的结尾;备注&#34;部分) - &#34;对实施者的说明&#34; - 和&#34;示例&#34;部分)。