2009-11-25 27 views
9

Ich habe eine Datatemplate, die ein Bild enthält, das ausgeblendet werden soll, wenn der Wert einer Eigenschaft in einem ViewModel wahr ist. Kann mir jemand sagen, warum das Xaml unten nicht funktioniert?WPF-Triggerbindung an MVVM-Eigenschaft

<Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0"> 
    <Image.Style> 
    <Style> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="True"> 
      <Setter Property="Image.Visibility" Value="Hidden" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Image.Style> 
</Image> 

Antwort

3

ist nicht, dass

<Setter Property="Visibility" Value="Hidden" /> 

?

Ich nehme an, Sie verwenden INotifyProptyChanged.

BEARBEITEN Ich habe etwas googeln und ich denke, Sie müssen eine Art von Vorlage verwenden, um den Auslöser arbeiten zu lassen.

zB .: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ae2dbfb7-5dd6-4352-bfa1-53634289329d

http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx

+0

Ja, ich implementiere INotifyPropertyChanged. Wenn ich den Setter wie oben ändern, erhalte ich den folgenden Kompilierungsfehler: Kann die Stileigenschaft 'Visibility' nicht auflösen. Stellen Sie sicher, dass der besitzende Typ der TargetType des Styles ist, oder verwenden Sie die Class.Property-Syntax, um die Eigenschaft anzugeben –

+0

Danke für diese, ich werde sie in Kürze durchgehen –

6

Versuchen Sie "Bild" Teil von Property = "Image.Visibility" zu entfernen, so Sie haben werden:

<Setter Property="Visibility" Value="Hidden"/> 

und füge Target zu Ihrem Stil :

<Style TargetType="{x:Type Image}"> 
4

Ich habe gerade etwas Simi getan Verwenden Sie ein ContentControl.

<ContentControl Content="{Binding CurrentListHasPendingChanges}"> 
    <ContentControl.ContentTemplate> 
    <DataTemplate> 
     <Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0" Visibility="Hidden" /> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

Von http://karlhulme.wordpress.com/2007/03/06/using-a-contentcontrol-and-datatemplate-to-indicate-new-andor-modified-data/

2

Meiner Meinung nach brauchen wir nicht Trigger zu verwenden, wobei nur die Bindung es gut funktioniert. Um Bindung an eine Eigenschaft Modell, Sie BooleanToVisibilityConverter können erklärt sich wie folgt:

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</UserControl.Resources> 

Und wie es zu benutzen ist einfach, Sie brauchen nur mit dem Schlüssel oben erwähnt:

<Image HorizontalAlignment="Left" Height="16" VerticalAlignment="Center" Width="16" 
     Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" 
     Source="/myPath;component/Resources/Images/image1.png"/> 

Die Eigenschaft im ViewModel:

private bool _hasError = false; 
    public bool HasError 
    { 
     get { return !string.IsNullOrEmpty(_messageError); } 
     set 
     { 
      _hasError = value;     
      this.NotifyOfPropertyChange(() => this.HasError); 
     } 
    } 
Verwandte Themen