简体   繁体   English

WPF DataTemplate.Triggers 不评估

[英]WPF DataTemplate.Triggers don't evaluate

Trying a simple DataTemplate implementation that doesn't work for some reason.尝试一个由于某种原因不起作用的简单 DataTemplate 实现。 It seems like the Bindings inside the conditions are never evaluated, even on the initial load.似乎条件中的绑定从未被评估,即使在初始加载时也是如此。 Any input is appreciated.任何输入表示赞赏。

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

EDIT: The Datacontext is set to the object with the following properties' definitions:编辑: Datacontext 设置为具有以下属性定义的对象:

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"));
        }
    }
}

The binding to Readiness works fine, but LastModifiedTimestamp isn't.与 Readiness 的绑定工作正常,但 LastModifiedTimestamp 不是。 IsNullConverter never gets called. IsNullConverter 永远不会被调用。

I ended up taking the easy out and put the triggers in the style of the element I tried to manipulate:我最终采取了简单的方法,并将触发器置于我试图操纵的元素的样式中:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM