【问题标题】:WPF Trigger binding to MVVM propertyWPF 触发器绑定到 MVVM 属性
【发布时间】:2010-12-20 05:02:15
【问题描述】:

我有一个包含图像的数据模板,如果 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>

【问题讨论】:

    标签: wpf binding triggers


    【解决方案1】:

    尝试从 Property="Image.Visibility" 中删除“Image”部分,这样您就可以:

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

    并将 TargetType 添加到您的样式中:

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

    【讨论】:

      【解决方案2】:

      我刚刚使用 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/

      【讨论】:

        【解决方案3】:

        不是这样

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

        ?

        我假设你使用 INotifyProptyChanged。

        编辑我做了一些谷歌搜索,我认为您需要使用某种模板才能使触发器工作。

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

        【讨论】:

        • 是的,我确实实现了 INotifyPropertyChanged。当我按照上述更改设置器时,我收到以下编译错误:无法解析样式属性“可见性”。验证所属类型是否为 Style 的 TargetType,或使用 Class.Property 语法指定 Property
        • 谢谢你,我会尽快处理的
        【解决方案4】:

        在我看来,我们不需要使用触发器,只有绑定它工作得很好。 要绑定到属性模型,可以使用 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);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2011-01-23
          • 2011-11-10
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-30
          • 2013-02-16
          • 1970-01-01
          相关资源
          最近更新 更多