如何在一个 XAML 窗口中处理多个数据上下文

本文关键字:窗口 处理 上下文 数据 XAML 一个 | 更新日期: 2023-09-27 18:34:16

我有一个类,我们把它称为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 不是设置为实例 OfSomeClass,而是设置为自定义类的列表。

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

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

这将运行,尽管它确实更改了属性并引发相应的通知,但它不会启用命令按钮。我推测这是因为组合的数据上下文与命令按钮的数据上下文不同

我尝试更改 SelectionChanged 事件中的数据上下文,但这只会导致组合中没有选择任何内容(不过启用了"保存"按钮!

任何帮助将不胜感激

如何在一个 XAML 窗口中处理多个数据上下文

我推测这是因为组合的数据上下文是 不同于命令按钮的数据上下文

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

检查按钮上的数据上下文,使用 snoop 因为它通过查找此类错误有很大帮助。确保该属性确实被提出,我数不清有多少次我们没有踏入实际的 NotifyPropertyChanged 错误所在的地方。

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

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

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

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