尝试一个由于某种原因无法运行的简单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永远不会被调用。
答案 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>