【问题标题】:Binding to a property via a ContentControl, using a DataTemplate and DataTemplateSelector使用 DataTemplate 和 DataTemplateSelector 通过 ContentControl 绑定到属性
【发布时间】:2012-05-06 17:06:21
【问题描述】:

这是我的 xaml

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:basic="clr-namespace:Emule.GUI.Design.Templates" 
xmlns:Search="clr-namespace:Emule.GUI.Features.Search" 
xmlns:Finder="clr-namespace:Emule.GUI.Util.Finder"mc:Ignorable="d"
x:Class="Emule.GUI.Features.Search.View" Title="View" Height="454" Width="696">

 <!-- Default DataTemplate --> 
<DataTemplate x:Key="DefaultDataTemplate"> 
   <TextBox Grid.Row="2"  Grid.Column="2" x:Name="joe"
          Visibility="{Binding OperatorValueVisibility, Mode=OneWay}"
          Text="{Binding OperatorValue, UpdateSourceTrigger=PropertyChanged}" /> 
</DataTemplate>

<!-- DataTemplate for string list --> 
<DataTemplate x:Key="ListStringDataTemplate"> 
  <basic:ListValuesSearch MinHeight ="740" x:Name="ListValues" /> 
</DataTemplate> 

<!-- DataTemplate Selector -->

<Search:PropertyDataTemplateSelector  x:Key="templateSelector" 
    DefaultDataTemplate="{StaticResource DefaultDataTemplate}" 
    BooleanDataTemplate="{StaticResource BooleanDataTemplate}" 
    EnumDataTemplate="{StaticResource EnumDataTemplate}"/> 

<StackPanel Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left" >
    <ContentControl ContentTemplateSelector="{StaticResource templateSelector}" 
                    Content="{Binding Path=PoDFinder.CodicePod}" />
</StackPanel> 

</Window>

这是我的控件(wpftoolkit 数据网格)

<UserControl x:Class="Emule.GUI.Design.Templates.ListValuesSearch" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit"

xmlns:Finder="clr-namespace:Emule.GUI.Util.Finder">

<UserControl.Resources> 
   <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="DataGrid.Generic.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
   </ResourceDictionary> 
</UserControl.Resources> 

<StackPanel> 
    <WpfToolkit:DataGrid ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, 
    Path=OperatorValues, Mode=TwoWay}" x:Name="ListValuesSearchControl"> 

     <WpfToolkit:DataGrid.Columns > 
        <WpfToolkit:DataGridTextColumn Header="Lista valori" Width="Auto" Binding="{Binding Path=Item}"/> 
    </WpfToolkit:DataGrid.Columns> 
   </WpfToolkit:DataGrid> 
</StackPanel> 

</UserControl>

我的数据模板 ListStringDataTemplate 不显示数据数据网格(显示类型名称),但请注意,如果我直接使用控件 &lt;basic:ListValuesSearch MinHeight ="740" x:Name="ListValues" /&gt; 而不使用数据模板选择器,则可以正常工作。

我认为问题出在这条路径ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, Path=OperatorValues, Mode=TwoWay}"

我可以解决这个问题,我错了吗?

谢谢

t.

【问题讨论】:

    标签: wpf data-binding contentcontrol


    【解决方案1】:

    为什么不去掉 DataTemplateSelector 并在 DataTemplates 中指定 DataType?它更容易,几乎可以工作。

    在您的用户控件中,您的绑定应该如下所示,但前提是 PoDFinder.CodicePod 是您的集合。如果不是,您必须添加属性的路径。

    <StackPanel> 
     <WpfToolkit:DataGrid ItemsSource="{Binding}"> 
       <WpfToolkit:DataGrid.Columns> 
        <WpfToolkit:DataGridTextColumn Header="Lista valori" Width="Auto" Binding="{Binding Path=Item}"/> 
       </WpfToolkit:DataGrid.Columns> 
      </WpfToolkit:DataGrid> 
    </StackPanel> 
    

    【讨论】:

    • 这是错误... ListStringDataTemplate="{StaticResource ListStringDataTemplate}" 不在 PropertyDataTemplateSelector 中,此更正工作正常
    • 就像我说的不需要数据模板选择器,您的代码将变得更加干净,只需数据模板、视图模型和右绑定:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2014-03-27
    • 1970-01-01
    • 2016-03-17
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多