如何在一个XAML窗口上处理多个DataContexts?

时间:2012-05-15 10:42:58

标签: c# .net wpf xaml

我有一个类,让我们将它称为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,而是设置为自定义类的List。

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

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

这会运行,虽然它会更改属性并引发相应的通知,但它不会启用命令按钮。我推测这是因为组合的DataContext与命令按钮的DataContext不同

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

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

  

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

不,我不这么认为。您可以尝试不将ItemsSource直接绑定到DataContext,而是使用datacontext上的成员或使用RelativeSource,ElementName,直接指定源或其他绑定语法。我非常建议使用属性中的集合,而不是将集合设置为datacontext(我个人认为非常糟糕的样式,{Binding}应该很少使用,我只在涉及ContentControl时才使用它。)

检查按钮上的Datacontext,使用snoop,因为它可以通过查找这些错误来帮助它。确保该属性真的被引发,我无法计算我们没有进入实际NotifyPropertyChanged错误的次数。

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

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

检查输出是否存在绑定错误或警告,如果使用vs10,则启用它们。

如果您能提供更多信息,我会更新我的答案,只是为了评论。