我有一个布尔属性,它查看几个复选框,如果选中其中任何一个,则返回true。如果选中任何复选框,我想启用一个按钮(属性返回true)。
目前我有以下内容:
数据上下文集
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
按钮绑定集
<Button Name="button" IsEnabled="{Binding ButtonEnabled}">Apply</Button>
财产
public bool ButtonEnabled
{
get
{
if(checkboxes_enabled)
return true;
else
return false;
}
}
我已经确认该属性正在按预期更新,因此它已缩小到绑定问题。我还尝试了按钮中的数据触发器:
<Button Name="button" Content="Apply">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding ButtonEnabled}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>
<DataTrigger Binding="{Binding ButtonEnabled}" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
答案 0 :(得分:5)
两件事:
如果要对绑定的属性进行更新,则需要INotifyPropertyChanged
。
public class MyClass
{
private bool _buttonEnabled;
public bool ButtonEnabled
{
get
{
return _buttonEnabled;
}
set
{
_buttonEnabled = value;
OnPropertyChanged();
}
}
public SetButtonEnabled()
{
ButtonEnabled = checkboxes_enabled;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged<T>([CallerMemberName]string caller = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(caller));
}
}
}
您也应该没有两个触发器,只需使用默认值。
<Button Name="button" Content="Apply">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ButtonEnabled}" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
答案 1 :(得分:1)
您需要添加以下代码才能实现INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
然后从属性设置器
调用OnPropertyChanged答案 2 :(得分:1)
我建议将按钮绑定到命令而不是事件,这样你就可以设置命令&#34; canexecute&#34;属性为false并禁用整个命令,实习生将为您禁用该按钮。
我建议使用以下教程来深入了解WPF命令以及如何使用它们。一旦了解它们的工作原理,我发现它们非常有用。
http://www.codeproject.com/Articles/274982/Commands-in-MVVM#hdiw1