我在 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 绑定
发布评论