Mam 2 zestawy bloków tekstowych, niektóre z nich są w kontrolerze pozycji, a niektóre z nich nie są, Chcę utworzyć styl (bazujący tylko na typie), który ustawia tło blok tekstu, jeśli jego przodkiem jest ItemControl.
Mogę to zrobić za pomocą następującego kodu, ale problem polega na tym, że w dzienniku (i oknie wyjściowym) zostanie wyświetlony komunikat o błędzie związanym z danymi z powodu blokad tekstowych, które nie mają pozycji Element sterujący jako element nadrzędny. Czy istnieje lepszy sposób na wykonanie tego zadania i uniknięcie tego komunikatu o błędzie?Ustawianie stylu na podstawie istnienia typu przodka
<Grid>
<Grid.Resources>
<local:HasAncestorConverter x:Key="HasAncestorConverter" />
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Converter={StaticResource HasAncestorConverter}}" Value="True">
<Setter Property="Background"
Value="{Binding Tag,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<StackPanel>
<TextBlock Text="Out of ItemControl" />
<ItemsControl Tag="Blue" >
<TextBlock Text="Inside of ItemControl" />
</ItemsControl>
</StackPanel>
</Grid>
Converter:
class HasAncestorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Komunikat o błędzie:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'NoTarget' (type 'Object')
To może być kolejny sposób, aby ustawić wartość, ale w tym przypadku będzie nadal pojawia się błąd na wyjściu, ponieważ wartość zerowa nie jest głównym problemem kwestia jest taka, że przodek nie istnieje, chcę uniknąć tam błąd. –
Nie przetestowałem, czy błąd zawsze zostanie odrzucony, ale zgodnie z msdn nie powinno tak być. FallbackValue oznacza wartość, która będzie używana, gdy żadna nie zostanie znaleziona. Więc nie sądzę, by został zgłoszony błąd, gdy na nieodnalezionej wartości zostanie użyta wartość FallbackValue. –