我试图在我的Button
上设置多个DataTriggers
。我做了一些研究,发现MultiDataTrigger
允许你这样做。我希望我的Button
的Visibility
属性被设置为false,如果CCTVPath == string.Empty
或PermissionsFlag == false
。这是我目前所拥有的;
<Button Grid.Column="3" x:Name="cctvFeedButton" Content="Live Feed"
Width="100" FontSize="16" HorizontalAlignment="Right" Margin="5" Click="OnCCTVButtonClick">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding CCTVPath}" Value=""/>
<Condition Binding="{Binding PermissionsFlag}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Hidden"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
在我的代码隐藏中,我这样设置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中:
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding PermissionsFlag}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
3条答案
按热度按时间htrmnn0y1#
将条件转换为两个独立的DataTrigger
请确定系结路径正确(检查VS输出 windows 中可能的例外状况消息)
另外:不要只依赖按钮隐藏状态,在代码(
OnCCTVButtonClick
)中正确实现权限。请在此处阅读原因:How to Snoop proof your wpf application?
auto-property PermissionsFlag(
public bool PermissionsFlag { get; set; }
)不会通知视图有关更改。可以实现
INotifyPropertyChanged
接口(在我的测试窗口中,它是这样完成的:public partial class Window3 : Window, INotifyPropertyChanged
),然后在属性更改时引发事件。下面是我用于测试的一个完整的工作示例
窗口XAML:
sshcrbum2#
另一种解决方案是使用一个DataTrigger和一个MultiBinding。您可以通过定义一个“特殊情况”IMultiValueConverter来使其工作,该转换器假定对象数组中有两项,如果第一项是空字符串或第二项是false,则返回true。但是,您可能永远不会在代码的其他任何地方使用该转换器。因此,如果您愿意在前面多做一些工作,您可以定义3个简单/可重用的转换器。
1)一个[IMultiValueConverter] 'OrConverter',它看起来像这样:
2)[IValueConverter]“IsNullOrEmpty”字符串转换器:
3)和[IValueConverter] '非转换器:'
然后,在您的xaml中,DataTrigger的定义如下:
我更喜欢这种解决方案,而不是使用2个单独的DataTrigger来提高可读性;它更好地表达了您正在定义的行为-它是“或”逻辑:应该隐藏按钮的2个条件的单一集合。
i34xakig3#
当文本框为空时,我使用这些触发器禁用“添加”按钮:
或(如果其中一个文本框被填充,按钮将启用)
AND(如果两个文本框都已填写,则按钮将启用)