【问题标题】:Databinding within ComboBox: Use Usercontrol to display each itemComboBox 中的数据绑定:使用用户控件显示每个项目
【发布时间】:2012-04-24 23:44:02
【问题描述】:

我有一个模型类 Person 和一个 UserControl PersonComboBoxItem 来显示它。

我想做的是,创建一个 ComboBox,它的 ItemsSource 绑定到我的名为 People 的 ObservableCollection<Person>,并使用我的 PersonUserControl 来显示集合中的每个 Person。

<Grid>
    <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" >            
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <local:PersonComboBoxItem Person="{Binding ###how do I get the current item here to set the property 'Person' on my PersonComboBoxItem class? ###  }"  />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Grid>

我已经完成了这个great article about databinding on msdn,但我无法过渡到我的设计方法。 随意批评它 - 我不确定这是否是 WPF 的方式。

问候,弗洛里安

P.S.:我的示例代码可以从here下载。

【问题讨论】:

    标签: c# wpf xaml data-binding user-controls


    【解决方案1】:

    只需使用隐式 DataTemplate 告诉 WPF 在可视化树中遇到 Person 对象时如何绘制它

    <Grid>
        <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" DisplayMemberPath="Name">            
            <ComboBox.Resources>
                <DataTemplate DataType="{x:Type local:Person}">
                    <local:PersonComboBoxItem />
                </DataTemplate>
            </ComboBox.Resources>
        </ComboBox>
    </Grid>
    

    ComboBox 已经将您的Person 数据对象放入VisualTree,可能看起来像这样:

    <StackPanel>
        <ContentPresenter>
            <Person />
        </ContentPresenter>
        <ContentPresenter>
            <Person />
        </ContentPresenter>
        <ContentPresenter>
            <Person />
        </ContentPresenter>
        ...
    </StackPanel>
    

    因此,您只需将 &lt;Person /&gt; 替换为 &lt;local:PersonComboBoxItem /&gt;。您的UserControlDataContext 也将设置为您的Person 对象

    此外,PersonItemComboBoxDataContext 将始终是 Person 类型,因此您甚至不需要 Person 依赖属性。

    【讨论】:

    • 也谢谢。我发现,我只能接受一个答案作为我的“已接受答案”。 --> 先到先得。 ;-)
    【解决方案2】:

    ItemTemplate 中的DataContext 是当前的Person,直接绑定到DataContext 从而绑定到Person 只需使用{Binding}

    您可以将UserControl 设计为直接使用当前的DataContext 而不是Person 属性,那么您无需显式设置任何内容。

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2014-09-05
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多