2016-07-15 11 views
3

Ich versuche, mehrere DataTriggers auf meine Button zu setzen. Ich habe etwas recherchiert und festgestellt, dass MultiDataTrigger Ihnen erlaubt, dies zu tun. Ich möchte die Visibility Eigenschaft meiner Button auf false gesetzt werden, wenn die CCTVPath == string.Empty ODER PermissionsFlag == false. Das habe ich bisher;MultiDataTrigger mit OR anstelle von UND

<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> 

Und in meinem Code-Behind setze ich PermissionsFlag so;

public bool PermissionsFlag { get; set; } 

private void OnPageLoaded(object sender, RoutedEventArgs e) 
{ 
    PermissionsFlag = false; 
} 

Wie Sie PermissionsFlag sehen kann, ist definitiv falsch, und die gibt es auf jeden Fall leer CCTVPath jedoch die Button nie versteckt. Was mache ich falsch?

UPDATE:

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; 
    } 

In meiner 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> 

Antwort

6

TRANFORM Bedingungen in zwei unabhängige 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> 

stellen Sie sicher, dass verbindliche Pfade korrekt sind (überprüfen VS Output Fenster für mögliche Ausnahmemeldungen)


auch: verlassen Sie sich nicht nur auf verstecktem Zustand der Schaltfläche, implementieren Berechtigungen ordnungsgemäß in Code ( OnCCTVButtonClick). Lesen Sie, warum hier:

How to Snoop proof your wpf application?



Auto-Eigenschaft PermissionsFlag (public bool PermissionsFlag { get; set; }) nicht benachrichtigt Blick über die Änderungen.

ist es möglich, INotifyPropertyChanged Schnittstelle zu implementieren (in meinem Testfenster ist es wie folgt getan:) und dann Ereignis auslösen, wenn sich die Eigenschaft ändert.

hier ist ein komplettes Arbeitsbeispiel, das ich für den Test verwendet

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)); 
    } 
} 

Fenster 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> 
+0

Vielen Dank für Ihre Zeit ASh. Wenn ich das tue, selbst wenn 'PermissionsFlag == false', wird der' Button' immer noch angezeigt, wenn ich erwarten würde, dass er unabhängig vom Wert von CCTVPath ausgeblendet wird. – CBreeze

+0

Ich habe erwartet, dass etwas nicht stimmt, als würde ich den 'CCTVPath'' DataTrigger' entfernen, dann verhält es sich wieder nicht so, wie ich es möchte. Kann ich einfach eine Methode hinzufügen, oder benötigt ich eine ganz neue Klasse, um das Ereignis zu erhöhen? Hast du irgendwelche guten Beispiele zur Hand? – CBreeze

+0

In der 'OnLoaded' Methode verwende ich' DataContext = this; '. 'PermissionsFlag' wird nur mit' public bool PermissionsFlag {get; einstellen; } ' – CBreeze