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

C# 如何在一个XAML窗口上处理多个数据上下文?,c#,.net,wpf,xaml,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("IsD

我有一个类,让我们称它为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));
    }
}
}
<ComboBox Name="cboListOfUsers" ItemsSource="{Binding}" SelectionChanged="cboSomeCombo_SelectionChanged"/>
我有一个表单,它使用了
SomeClass
的一个实例,名为
instanceOfSomeClass

该属性都正确触发,但主要问题是,我有一个保存按钮绑定到该属性,即

<Button Content="Save" Height="23" Name="btnSave" IsEnabled="{Binding Path=IsDirty}" Width="60" Margin="10, 10" HorizontalAlignment="Right" Click="btnSave_Click" />
这将运行,尽管它确实更改了属性并发出相应的通知,但它不会启用命令按钮。我推测这是因为组合的DataContext与命令按钮的DataContext不同

我已尝试在SelectionChanged事件中更改DataContext,但这只会导致在组合框中未选择任何内容(不过保存按钮已启用!)

任何帮助都将不胜感激

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

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

检查按钮上的Datacontext,使用它来查找类似这样的错误,这非常有帮助。确保该属性确实被提升,我无法计算有多少次我们没有在错误所在的实际NotifyPropertyChanged中介入

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

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

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


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

谢谢你提供的信息,我正在查看Snoop。该物业确实被人踏入并改变,所以我相信这是工作的广告。很快就会回来的!虽然它确实应该使用命令,但在本例中不是。此表单上没有触发器和动画等。如果您的问题是“我是否应该使用命令来代替”,答案是:这取决于:)如果命令可以通用以重用,则应使用命令。使用事件很好,有些人更喜欢命令,因为它更适合使用MVVM。虽然当您希望在特定条件下启用命令时,命令可以很好地工作。
instanceOfSomeClass.IsDirty = true;
instanceOfSomeClass.User = (ApplicationUser) cboSomeCombo.SelectedItem;