c# – 使用OR而不是AND的MultiDataTrigger

c# – 使用OR而不是AND的MultiDataTrigger,第1张

概述我想在我的Button上设置多个DataTriggers.我做了一些研究,发现MultiDataTrigger允许你这样做.如果CCTVPath == string.Empty OR PermissionsFlag == false,我希望我的Button的Visibility属性设置为false.这就是我到目前为止所拥有的; <Button Grid.Column="3" x:Name="cct 我想在我的button上设置多个DataTriggers.我做了一些研究,发现multidatatrigger允许你这样做.如果CCTVPath == string.Empty OR PermissionsFlag == false,我希望我的button的Visibility属性设置为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>
解决方法 将条件转换为两个独立的DataTriggers
<Style.Triggers>    <DataTrigger Binding="{Binding CCTVPath}" Value="">        <Setter Property="Visibility" Value="HIDden"/>    </DataTrigger>    <DataTrigger Binding="{Binding PermissionsFlag}" Value="False">        <Setter Property="Visibility" Value="HIDden"/>    </DataTrigger></Style.Triggers>

确保绑定路径正确(检查VS Output窗口是否有可能的异常消息)

另外:不要只依赖button的隐藏状态,在代码中正确实现权限(OnCCTVbuttonClick).在这里阅读原因:

How to Snoop proof your wpf application?

auto-property PermissionsFlag(public bool PermissionsFlag {get; set;})不会通知视图有关更改.

可以实现INotifyPropertyChanged接口(在我的测试窗口中它是这样完成的:公共部分类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:

<Window x:Class="WpfDemos.VIEws.Window3"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        title="Window3" Height="300" WIDth="300">    <StackPanel>        <CheckBox name="chkPermissionsFlag"                   Content="PermissionsFlag"                   IsChecked="{Binding Path=PermissionsFlag,UpdateSourceTrigger=PropertyChanged}"/>        <TextBox Text="{Binding Path=CCTVPath,UpdateSourceTrigger=PropertyChanged}"/>        <button x:name="cctvFeedbutton" Content="live Feed"                    WIDth="100" FontSize="16" HorizontalAlignment="Right" margin="5">            <button.Style>                <Style targettype="button">                    <Style.Triggers>                        <DataTrigger Binding="{Binding Path=CCTVPath}" Value="">                            <Setter Property="Visibility" Value="HIDden"/>                        </DataTrigger>                        <DataTrigger Binding="{Binding Path=PermissionsFlag}" Value="False">                            <Setter Property="Visibility" Value="HIDden"/>                        </DataTrigger>                    </Style.Triggers>                </Style>            </button.Style>        </button>    </StackPanel></Window>
总结

以上是内存溢出为你收集整理的c# – 使用OR而不是AND的MultiDataTrigger全部内容,希望文章能够帮你解决c# – 使用OR而不是AND的MultiDataTrigger所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1247416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存