需求的简短说明:我需要使用 ViewModel 的 DataContext 中的方法来触发 DataTemplate 内的按钮命令。

问题的简短说明:模板化按钮命令似乎只能绑定(bind)到项目本身的数据上下文。 WPF 和 Windows 8.1 应用程序用于向上遍历可视化树的语法似乎不起作用,包括 ElementName 和 Ancestor 绑定(bind)。我非常希望不要将我的按钮命令放在MODEL内。

旁注:这是使用 MVVM 设计方法构建的。

下面的代码生成 VIEW 上的项目列表。该列表是每个列表项的一个按钮。

            <ItemsControl x:Name="listView" Tag="listOfStories" Grid.Row="0" Grid.Column="1"
            ItemsSource="{x:Bind ViewModel.ListOfStories}"
            ItemTemplate="{StaticResource storyTemplate}"
            Background="Transparent"
            IsRightTapEnabled="False"
            IsHoldingEnabled="False"
            IsDoubleTapEnabled="False"
                 />

在同一个 VIEW 的页面资源中,我创建了一个 DataTemplate,其中包含有问题的按钮。我继续删除按钮内的大部分格式,例如文本,以使代码更易于阅读。除了列出的问题(即命令的绑定(bind))之外,与按钮相关的一切都有效。
<Page.Resources>
        <DataTemplate x:Name="storyTemplate" x:DataType="m:Story">
            <Button
                Margin="0,6,0,0"
                Width="{Binding ColumnDefinitions[1].ActualWidth, ElementName=storyGrid, Mode=OneWay}"
                HorizontalContentAlignment="Stretch"
                CommandParameter="{Binding DataContext, ElementName=Page}"
                Command="{Binding Source={StaticResource Locator}}">

                <StackPanel HorizontalAlignment="Stretch" >
                    <TextBlock Text="{x:Bind StoryTitle, Mode=OneWay}"
                        FontSize="30"
                        TextTrimming="WordEllipsis"
                        TextAlignment="Left"/>
                </StackPanel>
            </Button>
        </DataTemplate>
    </Page.Resources>

因为这是一个 DataTemplate,DataContext 已设置为组成列表 (MODEL) 的各个项目。我需要做的是选择列表本身的 DataContext (VIEWMODEL),这样我就可以访问导航命令。

如果您对 VIEW 页面的代码隐藏感兴趣,请参阅下文。
    public sealed partial class ChooseStoryToPlay_View : Page
    {
    public ChooseStoryToPlay_View()
    {
        this.InitializeComponent();
        this.DataContextChanged += (s, e) => { ViewModel = DataContext as ChooseStoryToPlay_ViewModel; };
    }
    public ChooseStoryToPlay_ViewModel ViewModel { get; set; }
}

我尝试通过 ElementName 设置它,以及许多其他尝试,但都失败了。输入 ElementName 时,Intellisense 检测到“storyTemplate”作为选项,这是本问题第一个代码块中显示的 DataTemplate 的名称。

我不相信我的问题是独一无二的,但是我很难找到 UWP 的解决方案。请允许我提前道歉,这是一个简单的问题,但我花了将近两天的时间研究答案,似乎没有一个适用于 UWP。

感谢你们!

最佳答案

您正在使用哪种MVVM工具包(如果有)?在 MVVM Light 中,您可以通过与为 View 设置 DataContext 相同的方式从 DataTemplate 获取 ViewModel:

<DataTemplate x:Key="SomeTemplate">
    <Button Command="{Binding Main.MyCommand, Source={StaticResource ViewModelLocator}}"/>
</DataTemplate>

关于c# - UWP 数据绑定(bind) : How to set button command to parent DataContext inside DataTemplate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34968211/

10-12 20:41