我有一个类,让我们将它称为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但这只会导致组合中没有选择任何内容(虽然启用了“保存”按钮!)
非常感谢任何帮助
答案 0 :(得分:0)
不,我不这么认为。您可以尝试不将ItemsSource直接绑定到DataContext,而是使用datacontext上的成员或使用RelativeSource,ElementName,直接指定源或其他绑定语法。我非常建议使用属性中的集合,而不是将集合设置为datacontext(我个人认为非常糟糕的样式,{Binding}应该很少使用,我只在涉及ContentControl时才使用它。)我猜测这是因为组合的DataContext是 与命令按钮的DataContext不同
检查按钮上的Datacontext,使用snoop,因为它可以通过查找这些错误来帮助它。确保该属性真的被引发,我无法计算我们没有进入实际NotifyPropertyChanged错误的次数。
确保您的按钮不使用sowhere命令,因为命令会以某种方式更改IsEnabled属性。
确保没有人覆盖IsEnabled属性,如触发器,动画等。
检查输出是否存在绑定错误或警告,如果使用vs10,则启用它们。
如果您能提供更多信息,我会更新我的答案,只是为了评论。