如何在一个 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 事件中的数据上下文,但这只会导致组合中没有选择任何内容(不过启用了"保存"按钮!
任何帮助将不胜感激
我推测这是因为组合的数据上下文是 不同于命令按钮的数据上下文
不,我不这么认为。你可以尝试这样做,方法是不将 ItemsSource 直接绑定到 DataContext,而是使用数据上下文上的成员或使用 RelativeSource、ElementName,直接指定源或其他绑定语法。我强烈建议使用属性中的集合,而不是将集合设置为数据上下文(我个人认为这真的很糟糕,{Binding}应该很少使用,我只在涉及ContentControls时才使用它(。
检查按钮上的数据上下文,使用 snoop 因为它通过查找此类错误有很大帮助。确保该属性确实被提出,我数不清有多少次我们没有踏入实际的 NotifyPropertyChanged 错误所在的地方。
确保按钮不使用命令 sowhere,因为命令会以某种方式更改 IsEnabled 属性。
确保没有人覆盖 IsEnabled 属性,如触发器、动画等。
检查输出中是否存在绑定错误或警告,如果使用 vs10,请启用它们。
如果您能提供更多信息,我将更新我的答案,只是为了发表评论。