带有OR而不是AND的MultiDataTrigger
我想在我的Button
上设置多个DataTriggers
。 我做了一些研究,发现MultiDataTrigger
允许你这样做。 如果CCTVPath == string.Empty
OR PermissionsFlag == false
我希望我的Button
的Visibility
属性设置为PermissionsFlag == false
。 这就是我到目前为止所拥有的;
在我的代码隐藏中,我设置PermissionsFlag
就像这样;
public bool PermissionsFlag { get; set; } private void OnPageLoaded(object sender, RoutedEventArgs e) { PermissionsFlag = false; }
正如你所看到的PermissionsFlag
肯定是假的,并且肯定是空CCTVPath
但是Button
永远不会被隐藏。 我究竟做错了什么?
更新:
public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private bool _permissionsFlag; public bool Flag { get { return _permissionsFlag; } set { _permissionsFlag = value; OnPropertyChanged("PermissionsFlag"); } } private void OnPageLoaded(object sender, RoutedEventArgs e) { Flag = false; CCTVImageCollection = GetImages(); imageListBox.ItemsSource = CCTVImageCollection; DataContext = this; }
在我的XAML中:
将条件转换为两个独立的DataTriggers
确保绑定路径正确(检查VS Output窗口是否有可能的exception消息)
另外:不要只依赖Button的隐藏状态,在代码中正确实现权限( OnCCTVButtonClick
)。 在这里阅读原因:
如何Snoopcertificate你的wpf应用程序?
auto-property PermissionsFlag( public bool PermissionsFlag { get; set; }
)不会通知视图有关更改。
可以实现INotifyPropertyChanged
接口(在我的测试窗口中它是这样完成的: public partial class Window3 : Window, INotifyPropertyChanged
)然后在属性更改时引发事件。
这是一个完整的工作示例,我用于测试
public partial class Window3 : Window, INotifyPropertyChanged { public Window3() { InitializeComponent(); this.DataContext = this; //PermissionsFlag = true; CCTVPath = "youtube.com"; } private bool _permissionsFlag = false; private string _cctvPath; public bool PermissionsFlag { get { return _permissionsFlag; } set { _permissionsFlag = value; OnPropertyChanged("PermissionsFlag"); } } public string CCTVPath { get { return _cctvPath; } set { _cctvPath = value; OnPropertyChanged("CCTVPath"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
窗口xaml: