WinRT在DataTemplate中绑定ViewMode的数据

时间:2016-06-13 12:24:47

标签: xaml binding windows-runtime

我想将数据绑定到存储在ViewModel中的DataTemplate中。我已经尝试了几种方法,但没有成功,WPF的解决方案似乎不像WinST那样可以像RelativeSource的AncestorType属性一样。

<Page.DataContext>
    <local:ViewModel x:Name="ViewModel" />
</Page.DataContext>

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{x:Bind ViewModel.names}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:mydatatype">
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <!--Here I want a TextBlock to show the number-->
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>

这是ViewModel

public class ViewModel
{
    public int Number = 42;
    public List<mydatatype> names = new List<mydatatype>();
    public ViewModel()
    {
        names.Add(new mydatatype("name1"));
        names.Add(new mydatatype("name2"));
    }
}

public class mydatatype
{
    public string Name { get; set; }
    public mydatatype(string name)
    {
        this.Name = name;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以通过为其他对象提供名称然后引用它来访问其他对象的DataTemplate。使用此技术,您应该能够访问其DataContext以直接绑定到viewmodel,即使是在DataTemplate中也是如此

<Page x:Name="PageRoot">
<Page.DataContext>
    <local:ViewModel x:Name="ViewModel" />
</Page.DataContext>

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="MainPanel">
    <ListView ItemsSource="{x:Bind ViewModel.names}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:mydatatype">
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <TextBlock Text="{Binding DataContext.Name, ElementName=PageRoot}"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>
</Page>