3

当我将我的集合绑定到以下窗口和用户控件时,样式不起作用。

当我按下窗口上的按钮时,样式就会启动。

是什么阻止我的样式在初始绑定时触发?

<Grid>
    <ItemsControl Name="LbItems" ItemsSource="{Binding MyData}">
        <ItemsControl.Resources>
            <DataTemplate DataType="{x:Type viewModel:SomeViewModel}">
                <control:SomeView Margin="5" />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModel:AnotherViewModel}">
                <control:AnotherView Margin="5" />
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>
</Grid>

我有一个用户控件如下:

<UserControl.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={x:Static 
                RelativeSource.Self}, Path=DataContext.Selected}" Value="False">
                <Setter Property="Foreground">
                    <Setter.Value>
                        Red
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={x:Static 
                RelativeSource.Self}, Path=DataContext.Selected}" Value="True">
                <Setter Property="Foreground">
                    <Setter.Value>
                        DarkSeaGreen
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Button Command="{Binding SelectCommand}"  Content="+" HorizontalAlignment=
        "Left" VerticalAlignment="Top" Width="25" Grid.Column="0"/>
    <TextBlock HorizontalAlignment="Left" Margin="5" TextWrapping="Wrap" Text=
        "{Binding Endorsement.Name}" VerticalAlignment="Top" Grid.Column="1" />
    <Button Command="{Binding DeselectCommand}" Content="-" HorizontalAlignment=
        "Right" VerticalAlignment="Top" Width="25" Grid.Column="2"/>
</Grid>
4

2 回答 2

1

您不必在 DataTrigger 绑定中执行此操作:

Binding="{Binding RelativeSource={x:Static 
            RelativeSource.Self}, Path=DataContext.Selected}"

默认情况下,绑定引用 DataContext,因此等效的更简单形式是:

Binding="{Binding Path=Selected}"

我认为这不会解决您的问题(但如果确实如此,那就太好了)。一种解决方法是如果两个触发器都没有触发,则在 Foreground 的样式中定义一个默认值:

<UserControl.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="Red" />
        <Style.Triggers>
        ...

这假设您的所有项目在加载时都被取消选择。希望这可以帮助。

干杯,埃里克

于 2013-10-18T12:54:16.750 回答
1

页面加载时和设置“选定”时是两个不同的时间;因此,当页面加载并且没有任何反应时,selected 为 null。预测空情况,例如添加样式

<DataTrigger Binding="{Binding RelativeSource={x:Static 
                RelativeSource.Self}, Path=DataContext.Selected}" Value="{x:Null}">
  ...
于 2013-10-18T12:58:59.277 回答