WPF资源样式未首次显示

时间:2013-10-18 11:33:29

标签: wpf xaml

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

Binding="{Binding Path=Selected}"

我不认为这会解决你的问题(但如果它确实很好)。解决它的一种方法是,如果两个触发器都没有触发,则为前景的样式定义默认值:

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

这假定您在加载时取消选择所有项目。希望这会有所帮助。

干杯, 埃里克

答案 1 :(得分:1)

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

<DataTrigger Binding="{Binding RelativeSource={x:Static 
                RelativeSource.Self}, Path=DataContext.Selected}" Value="{x:Null}">
  ...