gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:45:12 25 4
gpt4 key购买 nike

我正在尝试做一些人们认为应该非常简单的事情(至少在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com