gpt4 book ai didi

c# - 如何使用资源中的 ElementName 绑定(bind)?

转载 作者:行者123 更新时间:2023-11-30 16:57:00 25 4
gpt4 key购买 nike

我已将 MenuFlyout 添加到 ItemsControl.ItemTemplate 中的按钮。我也能够将当前项目绑定(bind)为 CommandParameter。现在我想将 Command 绑定(bind)到 MenuFlyoutItem。在代码隐藏中:

LayoutRoot.DataContext = this;

因此,如果我绑定(bind)到 LayoutRoot,我实际上将绑定(bind)到我当前的 UserControl。但是以下绑定(bind)不起作用:

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 不再位于您可能认为的 datacontext 中。我会尽我所能解释这一点,因为我认识的一些使用 xaml 的人已经遇到了这个问题,并且为此好几天都没有头绪。众所周知,在您的特定场景中不会显示错误;进一步增加困惑。

简而言之。当 MenuFlyout 添加到您集合中每个项目的 ItemTemplate 内时,它无法访问您可能认为可以访问的 datacontext。在这种情况下,控件现在所在的 datacontext 实际上是它所在的集合中的单个项目。

但是有一个解决办法。我有一些和你相似的东西。一个 ItemsControl,它的 ItemsTemplate 定义包括一个 UIElement,它是 FlyoutBase AP 引用一个 MenuFlyout 在资源字典中定义。

除了我不需要绑定(bind)中的 ElementName 外,xaml 几乎相同。

不过,我现在已将注意力转向收藏品的类型。我的代码看起来像这样。

public class AnItemToList
{
public AnItemToList(Action commandDel)
{
TestCommand = new RelayCommand(commandDel);
}
public string Name { get; set; }
public RelayCommand TestCommand { get; set; }
}

请注意,命令是在项目本身中定义的,我正在传递命令将通过构造函数执行的方法。

对于 MenuFlyoutItem 上的命令绑定(bind),我需要做的就是

<MenuFlyoutItem Text="Activate"
Name="Activate"
Command="{Binding TestCommand}"/>

我没有在此处设置命令参数,因为我只是快速组合了一个基本模板 Windows Phone 应用程序,而预打包的 ICommand 实现没有设置委托(delegate)来获取参数。

如果您现在在命令调用的方法中设置一个断点,您会看到它将从绑定(bind)到引用它的命令的任何 MenuFlyoutItem 调用。

请记住,这不是解决此问题的唯一方法;但这是我自己偶尔使用的。例如,在 WPF XAML 中,您可以使用 RelativeSource 在父控件的 datacontext 上查找命令。

希望这对您有所帮助。

关于c# - 如何使用资源中的 ElementName 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27245090/

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