WPF DataTemplate.Triggers没有评估

时间:2016-10-10 21:22:49

标签: c# wpf triggers datatemplate

尝试一个由于某种原因无法运行的简单DataTemplate实现。看起来条件中的Bindings永远不会被评估,即使在初始加载时也是如此。任何输入都表示赞赏。

 <DataTemplate x:Key="ReadinessCellTemplate">
        <StackPanel Orientation="Horizontal">
            <Grid>
                <Grid.Style>
                    <Style TargetType="Grid">
                        <Setter Property="Visibility" Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Readiness}" Value="{x:Static db:ReadinessState.DEVELOPMENT}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Grid.Style>
                <Ellipse Width="14" Height="14" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FF1B468A" />
                <TextBlock TextAlignment="Center" Text="D" Foreground="White" />
            </Grid>

            <Path x:Name="PART_ShapePath" Height="14" Width="14" Fill="#FF1B468A">
                <Path.ToolTip>
                    <ToolTip x:Name="PART_StatusToolTip" />
                </Path.ToolTip>
            </Path>
        </StackPanel>

        <DataTemplate.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding LastModifiedTimestamp, Converter={StaticResource IsNullConverter}, diag:PresentationTraceSources.TraceLevel=High}" Value="True" />
                    <Condition Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter TargetName="PART_ShapePath"  Property="Visibility" Value="Collapsed" />
            </MultiDataTrigger>

            <DataTrigger Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="False">

                <Setter TargetName="PART_ShapePath" Property="Visibility" Value="Visible" />
                <Setter TargetName="PART_ShapePath" Property="Data" Value="M9.0 0.0L0.0 16.0L18.0 16.0L9.00004001084 0.0ZM9.90797917744 14.0L8.0 14.0L8.0 12.0L10.0 12.0L10.0 14.053956628ZM9.43709923716 11.0L8.48917922657 11.0L8.0 6.87502426276L8.0 4.0L10.0 4.0L10.0 6.87502426276L9.43709923716 11.3799755923Z" />

                <Setter TargetName="PART_StatusToolTip" Property="Content">
                    <Setter.Value>
                        <StackPanel>
                            <StackPanel Orientation="Vertical">
                                <TextBlock Text="{Binding LastFailedBuildTimestamp, TargetNullValue=UNSPECIFIED, StringFormat={}When: {0}}" />
                                <TextBlock Text="{Binding LastBuildError, TargetNullValue=UNSPECIFIED, StringFormat={}Why: {0}}" />
                            </StackPanel>
                        </StackPanel>
                    </Setter.Value>
                </Setter>
            </DataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding LastModifiedTimestamp, Converter={StaticResource IsNullConverter}}" Value="False" />
                    <Condition Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter TargetName="PART_ShapePath"  Property="Visibility" Value="Visible" />
                <Setter TargetName="PART_ShapePath" Property="Data" Value="M 0,11 0,14 3.0056497,14 11.706214,5.220339 8.7005652,2.2146893 0,11 0,11 Z M 14,2.9265537 C 14.316384,2.6101695 14.316384,2.1355932 14,1.819209 L 12.180791,0 C 11.864407,-0.31638417 11.38983,-0.31638417 11.073446,0 L 9.6497174,1.4237288 12.655366,4.4293786 14,3 14,3 Z" />
                <Setter TargetName="PART_StatusToolTip" Property="Content">
                    <Setter.Value>
                        <StackPanel>
                            <StackPanel Orientation="Vertical">
                                <TextBlock Text="{Binding LastModifiedTimestamp, TargetNullValue=UNSPECIFIED, StringFormat={}When: {0}}" />
                                <TextBlock Text="{Binding LastModifiedBy, TargetNullValue=UNKNOWN, StringFormat={}Modified by: {0}}" />
                            </StackPanel>
                        </StackPanel>
                    </Setter.Value>
                </Setter>
            </MultiDataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

编辑: Datacontext设置为具有以下属性的对象&#39;定义:

public ReadinessState Readiness
{
    get { return _payload.Readiness; }
    set
    {

        bool t = _payload.Readiness != value;
        if (t)
        {
            _payload.Readiness = value;
            OnPropertyChanged("Readiness");
        }
    }
}
public DateTimeOffset? LastModifiedTimestamp
{
    get
    {
        return _payload?.LastModifiedTimestamp;
    }
    set
    {

        if (_payload != null && _payload.LastModifiedTimestamp != value)
        {
            LastModifiedBy = LockingSession?.Username;
            _payload.LastModifiedTimestamp = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LastModifiedTimestamp"));
        }
    }
}
public DateTimeOffset? LastFailedBuildTimestamp
{
    get
    {
        return _payload?.LastFailedBuildTimestamp;
    }
    set
    {

        if (_payload != null && _payload.LastFailedBuildTimestamp != value)
        {
            _payload.LastFailedBuildTimestamp = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LastFailedBuildTimestamp"));
        }
    }
}

public string LastModifiedBy
{
    get
    {
        return _payload?.LastModifiedBy;
    }
    private set
    {

        if (_payload != null && _payload.LastModifiedBy != value)
        {
            _payload.LastModifiedBy = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LastModifiedBy"));
        }
    }
}


public string LastBuildError
{
    get
    {
        return _payload?.LastBuildError;
    }
    set
    {

        if (_payload != null && _payload.LastBuildError != value)
        {
            _payload.LastBuildError = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LastBuildError"));
        }
    }
}

对Readiness的绑定工作正常,但LastModifiedTimestamp不是。 IsNullConverter永远不会被调用。

1 个答案:

答案 0 :(得分:0)

我最终采取了简单的方法,并将触发器设置为我试图操纵的元素的样式:

  <Path x:Name="PART_ShapePath" Height="14" Width="16" Fill="#FF1B468A">
            <Path.Style>
                <Style TargetType="Path">
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding LastModifiedTimestamp, Converter={StaticResource IsNullConverter}}" Value="True" />
                                <Condition Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Visibility" Value="Collapsed" />
                        </MultiDataTrigger>
                        <DataTrigger Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="False">

                            <Setter Property="Visibility" Value="Visible" />
                            <Setter Property="Data" Value="M9.0 0.0L0.0 16.0L18.0 16.0L9.00004001084 0.0ZM9.90797917744 14.0L8.0 14.0L8.0 12.0L10.0 12.0L10.0 14.053956628ZM9.43709923716 11.0L8.48917922657 11.0L8.0 6.87502426276L8.0 4.0L10.0 4.0L10.0 6.87502426276L9.43709923716 11.3799755923Z" />
                            <Setter Property="ToolTip">
                                <Setter.Value>
                                    <StackPanel>
                                        <StackPanel Orientation="Vertical">
                                            <TextBlock Text="{Binding LastFailedBuildTimestamp, TargetNullValue=UNSPECIFIED, StringFormat={}When: {0}}" />
                                            <TextBlock Text="{Binding LastBuildError, TargetNullValue=UNSPECIFIED, StringFormat={}Why: {0}}" />
                                        </StackPanel>
                                    </StackPanel>
                                </Setter.Value>
                            </Setter>

                        </DataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding LastModifiedTimestamp, Converter={StaticResource IsNullConverter}}" Value="False" />
                                <Condition Binding="{Binding LastFailedBuildTimestamp, Converter={StaticResource IsNullConverter}}" Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Visibility" Value="Visible" />
                            <Setter Property="Data" Value="M 0,11 0,14 3.0056497,14 11.706214,5.220339 8.7005652,2.2146893 0,11 0,11 Z M 14,2.9265537 C 14.316384,2.6101695 14.316384,2.1355932 14,1.819209 L 12.180791,0 C 11.864407,-0.31638417 11.38983,-0.31638417 11.073446,0 L 9.6497174,1.4237288 12.655366,4.4293786 14,3 14,3 Z" />
                            <Setter Property="ToolTip">
                                <Setter.Value>
                                    <StackPanel>
                                        <StackPanel Orientation="Vertical">
                                            <TextBlock Text="{Binding LastModifiedTimestamp, TargetNullValue=UNSPECIFIED, StringFormat={}When: {0}}" />
                                            <TextBlock Text="{Binding LastModifiedBy, TargetNullValue=UNKNOWN, StringFormat={}Modified by: {0}}" />
                                        </StackPanel>
                                    </StackPanel>
                                </Setter.Value>
                            </Setter>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </Path.Style>
        </Path>