xaml - 如何在 UWP 中进行相对源模式查找祖先(或等效项)

标签 xaml uwp

我正在尝试做一些人们认为应该非常简单的事情(至少在 WPF 中是这样)。 我有一个带有列表框和数据模板的页面,现在数据模板调用其中带有按钮的用户控件。没什么花哨的,但是按钮命令不是列表框源的一部分,而且我找不到一种简单的方法来告诉按钮在哪里寻找命令。这是场景

<Page x:Class="App1.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:App1">
<Page.Resources>
    <DataTemplate x:Key="MyDataTemplate">
        <local:MyButton />
    </DataTemplate>
</Page.Resources>
<ListBox ItemTemplate="{StaticResource MyDataTemplate}" ItemsSource="{Binding Customers}" />
</Page>

<UserControl x:Class="App1.MyButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Button Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl, AncestorLevel=2}, Path=DataContext.DeleteCommand}" Content="Delete" />
</UserControl>

请注意,这不会编译,因为在 UWP 中没有模式查找祖先?我该怎么办,我一直在google但找不到任何相关信息。

谢谢

最佳答案

答案是依赖属性。我也有同样的问题。 首先,如果您没有涉及 DataTemplate,则解决方案很简单:

(this.Content as FrameworkElement).DataContext = this;

您可以在其构造函数中将 UserControl 的 DataContext 设置为其后面的代码。

如果您计划在 DataTemplate 中使用您的命令,您还需要一个 DependecyProperty。

示例:

 <DataTemplate>
     <Button Command="{Binding DataContext.MyCommand, ElementName=ParentName}">
 </DataTemplate>

为了支持它,您为该命令创建一个依赖属性:

 public ICommand MyCommand
    {
        get { return (ICommand)GetValue(MyCommandProperty); }
        set { SetValue(MyCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyCommand.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyCommandProperty =
        DependencyProperty.Register("MyCommand", typeof(ICommand), typeof(ownerclass), new PropertyMetadata(0));

现在,当您使用用户控件时,您将拥有一个 MyCommand 属性,只要模板父级与您提供的匹配,并且参数绑定(bind)到实际的命令,您就可以将其绑定(bind)到 ViewModel 中的任何命令。控件所属的项目。

<usercontrols:button MyCommand="{Binding MyCommandFromViewModel}" CommandParameter="{Binding}"/>

简单的例子:

背后的UserControl代码

 public sealed partial class ListviewUserControl : UserControl
{
    public ListviewUserControl()
    {
        this.InitializeComponent();

        (this.Content as FrameworkElement).DataContext = this;
    }




    public ICommand ButtonCommand
    {
        get { return (ICommand)GetValue(ButtonCommandProperty); }
        set { SetValue(ButtonCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ButtonCommand.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ButtonCommandProperty =
        DependencyProperty.Register("ButtonCommand", typeof(ICommand), typeof(ListviewUserControl), new PropertyMetadata(null));




    public ObservableCollection<Item> ItemsSource
    {
        get { return (ObservableCollection<Item>)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ItemsSource.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register("ItemsSource", typeof(ObservableCollection<Item>), typeof(ListviewUserControl), new PropertyMetadata(new ObservableCollection<Item>()));



}

用户控件 Xaml:

<Grid>
    <ListView ItemsSource="{Binding ItemSource}" x:Name="ListView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <!--some item related content-->
                <AppBarButton Icon="Delete" Command="{Binding ButtonCommand, ElementName=ListView}" CommandParameter="{Binding}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

Page.xaml 中的用法:

<Controls:ListviewUserControl ItemsSource="{Binding ViewModelsItemsList}" ButtonCommand="{Binding ViewModelsCommand}"/>

关于xaml - 如何在 UWP 中进行相对源模式查找祖先(或等效项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32861612/

相关文章:

wpf - 如何在 itemscontrol 中的数据模板外部添加按钮

c# - XAML 嵌套绑定(bind) StringFormat

c# - 如何在 UWP 中每天午夜在后台运行一些代码?

c# - 如何比较厚度?

wpf - 在WPF中将父高度同步到子高度

c# - 设计具有可扩展 TextBlock 的 WPF 控件

wpf - WPF中的主要主题

c# - 如何在 UWP 中通过 PathGeometry 进行裁剪?

c# - 如何在 ItemsControl 中设置从 ItemTemplate 到托管容器的绑定(bind)? (UWP)

c# - 如何在 UWP 等 WPF 应用程序中使用连接动画