将DataTemplate绑定到ItemsControl的ItemsSource

时间:2014-03-07 11:05:06

标签: binding windows-runtime winrt-xaml datatemplate

如果已经提出此问题,我找不到正确的搜索字词。

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

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

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

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

此外,我有一个UserControl,其属性类型为OperationMessage:

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的属性?

感谢。

1 个答案:

答案 0 :(得分: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>