WPF:使用 DataTemplateSelector/ContentTemplateSelector 后文本框绑定不起作用
WPF : TextBox binding not working after using DataTemplateSelector/ContentTemplateSelector
我正在做一个树视图UI。我使用 DataTemplateSelector 来决定是否根据数据参数集合动态显示一系列文本框或组合框。
请在我的代码中注明。 ArugumentDetailsCollection 是一个包含 ArgumentDetails class 的可观察集合。 DefaultValue 是 ArgumentDetails class 中的字符串 属性。请注意 属性 不是依赖项 属性
问题是 DefaultValue 没有绑定到 TextBox。显示 TextBox 时,它包含空字符串。
请注意,如果不使用数据模板选择器,文本框可以正常工作。
请问有人可以建议吗?谢谢
<ItemsControl x:Name="argumentTexts" ItemsSource="{Binding ArgumentDetailsCollection}">
<ItemsControl.Resources>
<DataTemplate x:Key="TextBoxDataTemplate">
<TextBox Text="{Binding Path=DefaultValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center"
Width="Auto"
Margin="5,0,0,0"
Padding="0"
Style="{StaticResource GridEditStyle}"
IsEnabled="True"/>
</DataTemplate>
<DataTemplate x:Key="ComboBoxDataTemplate">
<ComboBox HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Width="Auto"
Margin="5,0,0,0"
Padding="0"
Style="{StaticResource GridEditStyle}"
IsEnabled="True"/>
</DataTemplate>
<columnConfiguratorControls:ArgumentTypeTemplateSelector x:Key="ArgTemplateSelector" ComboBoxDataTemplate="{StaticResource ComboBoxDataTemplate}" TextBoxDataTemplate="{StaticResource TextBoxDataTemplate}"/>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type structures:ArgumentDetails}">
<ContentControl Content="{Binding VisibleName}"
ContentTemplateSelector="{StaticResource ArgTemplateSelector}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在您的 ContentControl 中写入 Content="{Binding VisibleName}" 将使所选 DataTemplate 的数据上下文成为 VisibleName 属性。这就是您无法访问 DefaultValue 属性 的原因,因为它是 ArgumentDetails 的成员。
将绑定更改为:
Content="{Binding}"
您还需要检查您的 ContentTemplateSelector class
我正在做一个树视图UI。我使用 DataTemplateSelector 来决定是否根据数据参数集合动态显示一系列文本框或组合框。
请在我的代码中注明。 ArugumentDetailsCollection 是一个包含 ArgumentDetails class 的可观察集合。 DefaultValue 是 ArgumentDetails class 中的字符串 属性。请注意 属性 不是依赖项 属性
问题是 DefaultValue 没有绑定到 TextBox。显示 TextBox 时,它包含空字符串。
请注意,如果不使用数据模板选择器,文本框可以正常工作。 请问有人可以建议吗?谢谢
<ItemsControl x:Name="argumentTexts" ItemsSource="{Binding ArgumentDetailsCollection}">
<ItemsControl.Resources>
<DataTemplate x:Key="TextBoxDataTemplate">
<TextBox Text="{Binding Path=DefaultValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center"
Width="Auto"
Margin="5,0,0,0"
Padding="0"
Style="{StaticResource GridEditStyle}"
IsEnabled="True"/>
</DataTemplate>
<DataTemplate x:Key="ComboBoxDataTemplate">
<ComboBox HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Width="Auto"
Margin="5,0,0,0"
Padding="0"
Style="{StaticResource GridEditStyle}"
IsEnabled="True"/>
</DataTemplate>
<columnConfiguratorControls:ArgumentTypeTemplateSelector x:Key="ArgTemplateSelector" ComboBoxDataTemplate="{StaticResource ComboBoxDataTemplate}" TextBoxDataTemplate="{StaticResource TextBoxDataTemplate}"/>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type structures:ArgumentDetails}">
<ContentControl Content="{Binding VisibleName}"
ContentTemplateSelector="{StaticResource ArgTemplateSelector}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在您的 ContentControl 中写入 Content="{Binding VisibleName}" 将使所选 DataTemplate 的数据上下文成为 VisibleName 属性。这就是您无法访问 DefaultValue 属性 的原因,因为它是 ArgumentDetails 的成员。
将绑定更改为:
Content="{Binding}"
您还需要检查您的 ContentTemplateSelector class