如何使这种风格通用?

时间:2012-02-23 17:46:39

标签: c# .net wpf xaml styles

我有以下DataGridCell样式:

            <Style TargetType="DataGridCell" x:Key="DateChangeAnimation" >
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=Date.ValueChanged}" Value="True" />
                            <Condition Binding="{Binding Source={StaticResource BindProxy}, Path=Data.Columns.Date.NotifyChange}" Value="True" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation AutoReverse="True" From="#1F1F1F" To="#FFFF88" Duration="0:0:0.2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" />
                                </Storyboard>
                            </BeginStoryboard>
                        </MultiDataTrigger.EnterActions>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>

此样式具有为一个列单元格设置的绑定,因为我需要将其应用于20个或更多列,是否有一种方法以通用方式定义样式并根据需要多次实例化仅指定要绑定的变量?

3 个答案:

答案 0 :(得分:2)

我不完全确定你在问什么,但如果这是我认为的那么简短的回答是否定的(也许是)。

我这样说是因为我认为您希望能够以某种方式替换您编写的BindingExpressions而不会在每次变体时创建新样式。

那么,为什么可能是的?好吧,您可以使用DynamicResource并以编程方式创建样式,并在必要时替换BindingExpressions。


作为另一种选择,您可以创建一个自定义控件(或UserControl)来公开依赖项属性,然后将您的值变体绑定到这些属性,但这可能不值得。


这就是我猜你正试图通过一个更简单的例子来实现的目标。

<Style x:Key="MyDesiredGenericStyle" x:TargetType="TextBox">
  <Setter Property="Template">
  <Setter.Value>
    <Border ...>
        <StackPanel>
            <TextBlock Text="{Binding SomeGenericWay}" />
            <ContentPresenter />
        </StackPanel>
    </Border>
  </Setter.Value>
  </Setter>
</Style>

vs.

<Style x:Key="MyDesiredStyleA" x:TargetType="TextBox">
  <Setter Property="Template">
  <Setter.Value>
    <Border ...>
        <StackPanel>
            <TextBlock Text="{Binding Path=PropA}" />
            <ContentPresenter />
        </StackPanel>
    </Border>
  </Setter.Value>
  </Setter>
</Style>

<Style x:Key="MyDesiredStyleB" x:TargetType="TextBox">
  <Setter Property="Template">
  <Setter.Value>
    <Border ...>
        <StackPanel>
            <TextBlock Text="{Binding Path=PropB}" />
            <ContentPresenter />
        </StackPanel>
    </Border>
  </Setter.Value>
  </Setter>
</Style>

答案 1 :(得分:0)

不要给它键,所以默认情况下它将被设置为应用程序中的所有DataGridCell。

答案 2 :(得分:-1)

简单,删除密钥:

        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=Date.ValueChanged}" Value="True" />
                        <Condition Binding="{Binding Source={StaticResource BindProxy}, Path=Data.Columns.Date.NotifyChange}" Value="True" />
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation AutoReverse="True" From="#1F1F1F" To="#FFFF88" Duration="0:0:0.2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" />
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>