Я создаю шаблонный элемент управления для приложения UWP, и я попал в ловушку при попытке привязки во вложенном DataTemplate. Вот мой управления XAML в Themes/Generic.xaml:XAML TemplateBinding в DataTemplate
<Style TargetType="local:EnhancedListView">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:EnhancedListView">
<Grid HorizontalAlignment="Stretch">
<Grid.Resources>
<DataTemplate x:Key="ListViewTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<CheckBox Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource BooleanToVisibilityConverter}, Path=IsCheckModeEnabled}" Grid.Column="0" />
<TextBlock Text="{Binding}" Grid.Column="1" />
</Grid>
</DataTemplate>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource BooleanToVisibilityConverter}, Path=IsCheckModeEnabled}" Grid.Row="0">Hello</CheckBox>
<ListView Grid.Row="1" ItemsSource="{TemplateBinding ItemsSource}" ItemTemplate="{StaticResource ListViewTemplate}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Вот мой фактический контроль/преобразователь:
public class EnhancedListView : Control
{
public EnhancedListView()
{
DefaultStyleKey = typeof(EnhancedListView);
}
public object ItemsSource
{
get { return GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(object), typeof(EnhancedListView), new PropertyMetadata(null));
public bool IsCheckModeEnabled
{
get { return (bool)GetValue(IsCheckModeEnabledProperty); }
set { SetValue(IsCheckModeEnabledProperty, value); }
}
public static readonly DependencyProperty IsCheckModeEnabledProperty = DependencyProperty.Register("IsCheckModeEnabled", typeof(bool), typeof(EnhancedListView), new PropertyMetadata(null));
}
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotSupportedException();
}
}
Вот MainPage.xaml:
<local:EnhancedListView IsCheckModeEnabled="False" x:Name="ctlListView">
</local:EnhancedListView>
И, наконец, мой MainPage .xaml.cs:
public MainPage()
{
this.InitializeComponent();
ctlListView.ItemsSource = new List<string> { "Item 1", "Item 2" };
}
Как и следовало ожидать, при загрузке страницы первый флажок скрывается, поскольку IsCheckModeEnabled является ложным, но все флажки, вложенные в DataTemplate, все еще видны.
Я пробовал обертывать это в StaticResource, как предлагалось here, но он не работает с некоторыми сложными типами, такими как вложение другого DataTemplate в мой DataTemplate.
Я уверен, привязка не совсем прямо на собственность Видимость здесь:
<CheckBox Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource BooleanToVisibilityConverter}, Path=IsCheckModeEnabled}" Grid.Column="0" />
Спасибо за вашу помощь!
Без хорошей [mcve], которая надежно воспроизводит проблему, невозможно точно знать, в чем проблема, не говоря уже о лучшем исправлении. Но похоже, что вы ошибочно полагаете, что шаблонный родительский элемент элемента в «ListView» совпадает с шаблоном родителя шаблона, содержащего этот «ListView». Если этого недостаточно, чтобы указать вам в правильном направлении, пожалуйста, улучшите свой вопрос. –
И где смысл в написании 'DataContext = {{Binding}" '? – Clemens
@PeterDuniho - Я добавил дополнительные сведения, чтобы улучшить вопрос. Я также не «ошибочно полагаю», что родитель шаблона элемента «ListView» совпадает с родительским контейнером, я просто не знаю, как его представлять и привязывать к нему. – Matt