【发布时间】: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,用于内部处理。
<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}" > -
@Clemens 我已将其更改为依赖属性,但它仍然无法正常工作。我想故意将每个项目分配给 CurrentMessage 属性,而不是整个 UserControl 的 DataContext。
标签: binding windows-runtime winrt-xaml datatemplate