【问题标题】:Binding DataTemplate to ItemsControl's ItemsSource将 DataTemplate 绑定到 ItemsControl 的 ItemsSource
【发布时间】:2014-03-07 11:05:06
【问题描述】:

如果这个问题已经被问过,我找不到正确的搜索词。

我有一个带有 Observable 集合的视图模型。

class MyViewModel
{
    public ObservableCollection<OperationMessage> PendingMessages { get; set; }
}

我在页面后面的代码中设置了视图模型:

class MyPage : Page
{
    public MyPage()
    {
        this.InitializeComponent();
        MyViewModel myViewModel = new MyViewModel();
        this.DefaultViewModel["MyViewModel"] = myViewModel;
    }
}

此外,我还有一个带有 OperationMessage 类型属性的 UserControl:

public class MachineMessages : UserControl
{
    public OperationMessage CurrentMessage { get; set; }
}

在 MyPage.xaml.cs 中,我想创建一个 ItemsControl 并将其绑定到 ObservableCollection。

<ItemsControl x:Name="MessageList" ItemsSource="{Binding Path=ViewModel.PendingMessages}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <MyControls:MachineMessages DataContext="{Binding}" CurrentMessage="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

因此,对于 OperationMessage 类型的每个项目,我希望 ItemsControl 创建一个新的用户控件 - 这很有效。但我还想另外将每个 OperationMessage 绑定到 UerControl 的属性 CurrentMessage。所以这条线不起作用:

<MyControls:MachineMessages DataContext="{Binding}" CurrentMessage="{Binding}" />

那么如何将 ObservableCollection 的每一项绑定到 UserControl 的属性上呢?

谢谢。

【问题讨论】:

  • DataContext="{Binding}" 部分是多余的。无论如何,它是默认完成的。为了使CurrentMessage="{Binding}" 部分工作,CurrentMessage 必须是dependency property。但是,当 DataContext 已经设置为当前项时,为什么还需要这个呢?
  • 用户控件用于许多页面,也是“独立的”。只有在这种情况下,我才想将其用作项目控件的数据模板。因此,由于这个原因,用户控件已经将其自己的数据上下文设置为 RelativeSource=Self,用于内部处理。 &lt;UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}" &gt;
  • @Clemens 我已将其更改为依赖属性,但它仍然无法正常工作。我想故意将每个项目分配给 CurrentMessage 属性,而不是整个 UserControl 的 DataContext。

标签: binding windows-runtime winrt-xaml datatemplate


【解决方案1】:

CurrentMessage 属性可以简单地返回 DataContext 对象:

public class MachineMessages : UserControl
{
    public OperationMessage CurrentMessage
    {
        get { return DataContext as OperationMessage; }
    }
}

您的 DataTemplate 看起来像这样,因为您不需要显式绑定 DataContext:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <MyControls:MachineMessages />
    </DataTemplate>
</ItemsControl.ItemTemplate>

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2019-12-11
    • 2011-12-09
    • 2010-12-21
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多