我有一个实现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)
,现在它运行得很好。感谢您的所有帮助!
答案 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;部分)。