如何使用资源中的元素名称绑定
本文关键字:绑定 元素 何使用 资源 | 更新日期: 2023-09-27 18:32:41
我在 ItemsControl.ItemTemplate 中的按钮中添加了一个 MenuFlyout。此外,我还能够将当前项目绑定为命令参数。现在我想将命令绑定到 MenuFlyoutItem。在代码隐藏中:
LayoutRoot.DataContext = this;
因此,如果我绑定到 LayoutRoot,我实际上将绑定到我当前的 UserControl。但是以下绑定不起作用:
Command="{Binding ActivateProfileCommand, ElementName=LayoutRoot}"
它不会在输出中给我错误,但它不起作用。下面是完整示例:
<controls:HeaderDecorator x:Uid="AccountsHeader" Text="Accounts" x:Name="LayoutRoot" Name="LayoutRoot">
<controls:HeaderDecorator.Resources>
<MenuFlyout x:Key="AccountMenuFlyout">
<MenuFlyoutItem Text="Activate" Name="Activate"
Command="{Binding ActivateProfileCommand, ElementName=LayoutRoot}"
CommandParameter="{Binding}" />
</MenuFlyout>
</controls:HeaderDecorator.Resources>
<StackPanel Orientation="Vertical">
<ItemsControl ItemsSource="{Binding Settings.Profiles}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<HyperlinkButton Content="{Binding}" FlyoutBase.AttachedFlyout="{StaticResource AccountMenuFlyout}" >
<i:Interaction.Behaviors>
<ic:ShowFlyoutBehavior />
</i:Interaction.Behaviors>
</HyperlinkButton>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</controls:HeaderDecorator>
似乎问题是我正在尝试在资源中使用共享对象。我能做到吗?为什么不呢?
您在这里看到的问题是 MenuFlyoutItem 不再存在于您可能认为的数据上下文中。我会尽力解释这一点,因为我认识的几个使用 xaml 的人都遇到了这个问题,并为此打了好几天的头。众所周知,在特定方案中不显示错误;进一步增加混乱。
简而言之。当 MenuFlyout 添加到集合中每个项的 ItemTemplate 中时,它无法访问您可能认为它有权访问的数据上下文。在这种情况下,控件现在驻留的数据上下文实际上是它所在的集合中的单个项。
但是,有一个解决方案。我和你有什么相似的东西。定义了 ItemsTemplate的 ItemsControl,其中包括一个 UIElement,该 UIElement 的 FlyoutBase AP 引用资源字典中定义的 MenuFlyout。
xaml 几乎相同,除了我不需要绑定中的元素名称。
但是,我现在已将注意力转向该系列所包含的类型。我的代码看起来像这样。
public class AnItemToList
{
public AnItemToList(Action commandDel)
{
TestCommand = new RelayCommand(commandDel);
}
public string Name { get; set; }
public RelayCommand TestCommand { get; set; }
}
请注意,命令是在项本身中定义的,并且我正在传递命令将通过构造函数执行的方法。
对于菜单浮出控件项上的命令绑定,我所要做的就是
<MenuFlyoutItem Text="Activate"
Name="Activate"
Command="{Binding TestCommand}"/>
我在这里没有设置命令参数,因为我只是快速将一个基本模板 Windows Phone 应用程序放在一起,并且预打包的 ICommand 实现没有设置委托来获取参数。
如果现在在命令调用的方法中插入断点,你将看到它将从绑定到引用它的命令的任何 MenuFlyoutItem 调用。
请记住,这不是解决这个问题的唯一方法;但这是我偶尔使用的方法。例如,在 WPF XAML 中,可以使用 RelativeSource 在父控件的数据上下文中查找命令。
希望这有帮助。
下面是一个通用的"Pair"对象:
public class Pair : DependencyObject
{
public static readonly DependencyProperty FirstProperty = DependencyProperty.Register("First",
typeof(object), typeof(Pair), new PropertyMetadata(null));
public static readonly DependencyProperty SecondProperty = DependencyProperty.Register("Second",
typeof(object), typeof(Pair), new PropertyMetadata(null));
public object First
{
get { return GetValue(FirstProperty); }
set { SetValue(FirstProperty, value); }
}
public object Second
{
get { return GetValue(SecondProperty); }
set { SetValue(SecondProperty, value); }
}
}
在ItemTemplate中,我放了这样的东西:
<DataTemplate>
<Grid>
<Grid.Resources>
<viewModel:Pair x:Key="Tuple" First="{Binding DataContext, ElementName=LayoutRoot}"
Second="{Binding}" />
</Grid.Resources>
<HyperlinkButton Content="{Binding Second.ProfileName}"
DataContext="{StaticResource Tuple}"
FlyoutBase.AttachedFlyout="{StaticResource AccountMenuFlyout}"
</HyperlinkButton>
</Grid>
</DataTemplate>
现在我可以轻松地从我的资源中引用元组元素,如下所示:
<MenuFlyoutItem Text="Activate" Name="Activate"
Command="{Binding First.ActivateProfileCommand}"
CommandParameter="{Binding Second}" />