web-dev-qa-db-ja.com

MVVMプロパティへのWPFトリガーのバインド

ViewModelのプロパティの値がtrueの場合に非表示にしたい画像を含むデータテンプレートがあります。以下のxamlが機能しない理由を誰かに教えてもらえますか?

<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>
11
David Ward

そうじゃない

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

INotifyProptyChangedを使用していると仮定します。

[〜#〜] edit [〜#〜]グーグルを実行しましたが、トリガーを作成するには、何らかのテンプレートを使用する必要があると思います作業。

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

3
Natrium

Property = "Image.Visibility"から "Image"の部分を削除して、次のようにします。

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

targetTypeをスタイルに追加します。

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

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>

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

4
a_hardin

私の意見では、トリガーを使用する必要はありません。バインディングだけでうまく機能します。プロパティモデルへのバインドを行うには、BooleanToVisibilityConverterを使用できます。次のように宣言されます。

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

そしてそれを使用する方法は簡単です、ちょうど上記のキーを指してください:

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

ViewModelのプロパティ:

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