需求的简短说明:我需要使用 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/