WPF 风格的 DataTrigger 绑定

编程入门 行业动态 更新时间:2024-10-18 08:27:18
本文介绍了WPF 风格的 DataTrigger 绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

I have the following Button and Style in WPF and I need to generalize the Binding in the DataTrigger section because I have near 10 similar buttons in the same Window and each button should be binded to a different property (SelectedPositions, SelectedAgencies, ....). Is it possible to implement?

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

推荐答案

你能给我举个例子说明你的解释吗?

could you provide me an example of what you explained?

当然,

1 - 使用标签

在你的 Style 中有你的 DataTrigger 为:

In your Style have your DataTrigger as:

<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 的命名空间.

"local:" refers to the xaml namespace alias of your application or if you use different namespaces, the namespace where MyCustomPropertyCollection is declared.

代码隐藏:

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 in xaml not only needs DataTrigger updated but Style definition too.

所以切换

<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 的自定义类也被过度使用那样清楚地表明依赖关系.选择您喜欢的.

Tag approach is frowned upon. "Attached Property" is easier to implement but isn't as clear of a indicator of dependencies as a custom class with a normal DP and AP also gets way overused. Take your pick for what you'd prefer.

更多推荐

WPF 风格的 DataTrigger 绑定

本文发布于:2023-11-06 23:43:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1564992.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   风格   WPF   DataTrigger

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!