【问题标题】:DataTrigger Binding in WPF StyleWPF 样式中的 DataTrigger 绑定
【发布时间】:2013-07-10 00:13:48
【问题描述】:

我在 WPF 中有以下按钮和样式,我需要概括 DataTrigger 部分中的绑定,因为我在同一个窗口中有近 10 个类似的按钮,并且每个按钮都应该绑定到不同的属性(SelectedPositions、SelectedAgencies、. ...)。可以实现吗?

    <Button x:Name="btnPosition"
            Grid.Row="0"
            Grid.Column="0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            Command="{Binding PositionFilterCommand}"
            Content="{l:Translate position}"
            Style="{StaticResource NewButtonStyle}" />

    <Style x:Key="NewButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Height" Value="22" />
        <Setter Property="Width" Value="Auto" />
        <Setter Property="FontFamily" Value="OpenSans" />
        <Setter Property="FontSize" Value="13" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="Margin" Value="10,2,10,0" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border CornerRadius="3">
                        <Grid x:Name="gridButton" Background="#54728e">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Image x:Name="img"
                                   Grid.Column="0"
                                   Width="24"
                                   Height="24"
                                   Source="Img/tick-white.png"
                                   Visibility="Visible" />
                            <Rectangle x:Name="rect"
                                       Grid.Column="1"
                                       Fill="#54728e"
                                       RadiusX="3"
                                       RadiusY="3" />
                            <ContentPresenter Grid.Column="1"
                                              Margin="5,0,5,0"
                                              HorizontalAlignment="Stretch"
                                              VerticalAlignment="Center" />
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding SelectedPositions}" Value="{x:Static sys:String.Empty}">
                            <Setter TargetName="rect" Property="Fill" Value="#8bbcdf" />
                            <Setter TargetName="img" Property="Visibility" Value="Collapsed" />
                            <Setter TargetName="gridButton" Property="Background" Value="#8bbcdf" />
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

【问题讨论】:

  • 所有这些属性(SelectedPositions, SelectedAgencies, ....)是否属于同一类型?如果是这样,您可以使用按钮的附加属性或普通依赖属性,并在通用样式中检查该值,并在控件上将此 DP 绑定到每个相应的源属性。你也可以使用Tag 属性来做同样的事情,尽管这通常是不被接受的。
  • 是的,这些属性属于同一类型(字符串)。每个 Button 都有自己的属性、内容和命令。拜托,你能给我一个你解释的例子吗?提前致谢。
  • 是的,每个都添加了一个示例。选择并进一步研究什么是最适合您的要求。

标签: c# .net wpf mvvm


【解决方案1】:

你能给我一个你解释的例子吗?

当然,

1 - 使用标签

在您的Style 中有您的DataTrigger 为:

<DataTrigger Binding="{Binding Path=Tag,
                                RelativeSource={RelativeSource Self}}"
              Value="{x:Static sys:String.Empty}">
  ...
</DataTrigger>

关于用法:

<Button x:Name="btnPosition"
            Grid.Row="0"
            Grid.Column="0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            Command="{Binding PositionFilterCommand}"
            Content="{l:Translate position}"
            Tag="{Binding SelectedPositions}"
            Style="{StaticResource NewButtonStyle}" />

2 - 使用附加属性

“local:”指的是您的应用程序的 xaml 命名空间别名,或者如果您使用不同的命名空间,则为声明 MyCustomPropertyCollection 的命名空间。

代码隐藏:

public class MyCustomPropertyCollection {
  public static readonly DependencyProperty SomeStringProperty =
    DependencyProperty.RegisterAttached(
      "SomeString",
      typeof(string),
      typeof(MyCustomPropertyCollection),
      new FrameworkPropertyMetadata(string.Empty));

  public static void SetSomeString(UIElement element, string value) {
    element.SetValue(SomeStringProperty, value);
  }

  public static string GetSomeString(UIElement element) {
    return (string)element.GetValue(SomeStringProperty);
  }
}

Style.DataTrigger

<DataTrigger Binding="{Binding Path=(local:MyCustomPropertyCollection.SomeString),
                                RelativeSource={RelativeSource Self}}"
              Value="{x:Static sys:String.Empty}">
  ...
</DataTrigger>

用法:

<Button x:Name="btnPosition"
            Grid.Row="0"
            Grid.Column="0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            Command="{Binding PositionFilterCommand}"
            Content="{l:Translate position}"
            local:MyCustomPropertyCollection.SomeString="{Binding SelectedPositions}"
            Style="{StaticResource NewButtonStyle}" />

3 - 正常 依赖属性

自定义Button类:

public class MyButton : Button {
  public static readonly DependencyProperty SomeStringProperty =
    DependencyProperty.Register(
      "SomeString",
      typeof(string),
      typeof(MyButton),
      new FrameworkPropertyMetadata(string.Empty));

  public string SomeString {
    get {
      return (string)GetValue(SomeStringProperty);
    }
    set {
      SetValue(SomeStringProperty, value);
    }
  }
}

xaml 中的样式不仅需要更新DataTrigger,还需要定义Style

所以切换

<Style x:Key="NewButtonStyle" TargetType="{x:Type Button}">

<Style x:Key="NewButtonStyle" TargetType="{x:Type local:MyButton}">

Style.DataTrigger

<DataTrigger Binding="{Binding Path=SomeString,
                                RelativeSource={RelativeSource Self}}"
              Value="{x:Static sys:String.Empty}">
  ...
</DataTrigger>

用法:

<local:MyButton x:Name="btnPosition"
            Grid.Row="0"
            Grid.Column="0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            Command="{Binding PositionFilterCommand}"
            Content="{l:Translate position}"
            SomeString="{Binding SelectedPositions}"
            Style="{StaticResource NewButtonStyle}" />

Tag 方法是不受欢迎的。 “附加属性”更容易实现,但不像具有普通 DP 和 AP 的自定义类那样清楚地指示依赖关系,也被过度使用。选择您喜欢的。

【讨论】:

  • 如果我尝试触发特定字符串而不是 String.EmptyValue="..." 会是什么样子?
  • 如果要问的不是太多,您能否看看我当前的问题并告诉我如何基于枚举执行DataTriggerstackoverflow.com/q/31615946/1245420
猜你喜欢
  • 2019-04-29
  • 2013-10-19
  • 2013-06-04
  • 2011-10-09
  • 2015-06-29
  • 2012-12-06
  • 2017-01-23
  • 2011-02-19
  • 2017-02-16
相关资源
最近更新 更多