0

我有一个类,我们将其称为 SomeClass。SomeClass 实现了 INotifyPropertyChanged ,代码如下:

public class SomeClass
{
.
.
.
private bool _isDirty;

public bool IsDirty
{
    get { return this._isDirty; }
    set
    {
    this._isDirty = value;
    this.NotifyPropertyChanged("IsDirty");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propertyName)
{
    if (this.PropertyChanged != null)
    {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
}

我有一个使用 的实例的表单SomeClass,称为instanceOfSomeClass

该属性全部正确触发,但主要问题是我将保存按钮绑定到该属性即。

<Button Content="Save" Height="23" Name="btnSave" IsEnabled="{Binding Path=IsDirty}" Width="60" Margin="10, 10" HorizontalAlignment="Right" Click="btnSave_Click" />

组合框 SelectionChanged 事件应该更改该属性,定义如下:

<ComboBox Name="cboListOfUsers" ItemsSource="{Binding}" SelectionChanged="cboSomeCombo_SelectionChanged"/>

(我已经删除了与问题无关的部分组合框定义,例如样式等)

关键是组合框的 DataContext 没有设置为 instanceOfSomeClass,而是自定义类的列表。

SelectionChanged 事件触发,我的代码如下所示:

instanceOfSomeClass.IsDirty = true;
instanceOfSomeClass.User = (ApplicationUser) cboSomeCombo.SelectedItem;

这会运行,尽管它确实会更改属性并引发适当的通知,但它不会启用命令按钮。我推测这是因为组合的 DataContext 与命令按钮的 DataContext 不同

我尝试在 SelectionChanged 事件中更改 DataContext ,但这只会导致组合中没有选择任何内容(虽然启用了“保存”按钮!)

任何帮助将不胜感激

4

1 回答 1

0

我推测这是因为组合的 DataContext 与命令按钮的 DataContext 不同

不,我不这么认为。您可以尝试不将 ItemsSource 直接绑定到 DataContext,而是使用数据上下文上的成员或使用 RelativeSource、ElementName,直接指定源或其他绑定语法。我强烈建议使用来自属性的集合,而不是将集合设置为数据上下文(我个人认为那是非常糟糕的风格,{Binding} 应该很​​少使用,我只在涉及 ContentControls 时使用它)。

检查按钮上的 Datacontext,使用snoop来查找此类错误有很大帮助。确保该属性确实被提升了,我无法计算有多少次我们没有进入错误所在的实际 NotifyPropertyChanged。

确保您的按钮在某处不使用命令,因为命令会以某些方式更改 IsEnabled 属性。

确保没有人覆盖 IsEnabled 属性,例如触发器、动画等。

检查输出是否有绑定错误或警告,如果您使用 vs10,请启用它们。

如果您可以提供更多信息,我将更新我的答案,只是为了发表评论。

于 2012-05-15T11:09:41.860 回答