ICommand 将转到 itemsource 而不是 datacontext

ICommand is going to the itemsource instead of the datacontext

我按原样知道我的命令,没有找到正确的路径。

Error: BindingExpression path error: 'OnButtonClickedCommand' property not found on 'App1.Helper.FoodTypes, App1.Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. BindingExpression: Path='OnButtonClickedCommand' DataItem='App1.Helper.FoodTypes, App1.Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Windows.UI.Xaml.Controls.Button' (Name='button1'); target property is 'Command' (type 'ICommand')

下面我使用项目源中的元素来设置标签和内容。但是我希望将我发送的命令发送到数据上下文。但是它被发送到同一个元素。

MenuItemsPage.xaml

<DataTemplate x:Key="foodTypeTemplate">
    <Button x:Name="button1" Width="100" Height="50" Content="{Binding Name}" Tag="{Binding Name}" 
              Command="{Binding OnButtonClickedCommand}"                   
            CommandParameter="{Binding ElementName=button1}"/>
</DataTemplate>

我知道该命令将转到项目源 (CategoryButtonList) 的元素,因为如果我将 OnButtonClickedCommand 替换为 Name ,就会找到路径。相反,我希望它转到我在 cs 文件中设置的数据上下文。根据我的研究,您应该将 RelativeResource 与 FindAncestorType 一起使用,但我的平台似乎不支持它。

Error   3   The property 'AncestorType' was not found in type 'RelativeSource'.

我希望它转到数据上下文的原因是因为那是所有逻辑所在的地方。

下面是我如何设置 ItemsSource

MenuItemsPage.xaml

    <ListBox HorizontalAlignment="Left" Height="425" Margin="75,140,0,0" VerticalAlignment="Top" Width="105"
             ItemsSource="{Binding CategoryButtonList}" ItemTemplate="{StaticResource foodTypeTemplate}" >
    </ListBox>

在我的 MenuItemsPage 中,我在代码中设置了 DataContext。也许我应该在 xaml 中设置它以保持我的 cs 干净?

MenuItemsPage.xaml.cs

public sealed partial class MenuItemsPage : Page
    {
        public MenuItemsPage()
        {
            this.InitializeComponent();                   
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            string tableName = e.Parameter as string;
            this.DataContext = new MenuPageVM(tableName);        
        }
    }

尝试使用 "ElementName" 和 "DataContext.OnButtonClickedCommand"

引用 ListBox 的数据上下文
<ListBox x:Name ="CategoryListBox" HorizontalAlignment="Left" Height="425" Margin="75,140,0,0" VerticalAlignment="Top" Width="105"
             ItemsSource="{Binding CategoryButtonList}" ItemTemplate="{StaticResource foodTypeTemplate}" >
    </ListBox>


<DataTemplate x:Key="foodTypeTemplate">
    <Button x:Name="button1" Width="100" Height="50" Content="{Binding Name}" Tag="{Binding Name}" 
              Command="{Binding DataContext.OnButtonClickedCommand, ElementName = CategoryListBox}"                   
            CommandParameter="{Binding ElementName=button1}"/>
</DataTemplate>

DataTemplate(及其所有子项,例如您的 Button)的 DataContext ItemsSource实际 ListBox。如果命令在 windowDataContext 中定义,则使用 ElementNameRelativeSource:

<Window x:Name="MyWindow" ... >
    <ListBox ItemsSource="...">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding ElementName=MyWindow, Path=DataContext.MyCommand}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

<Window ... >
    <ListBox ItemsSource="...">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.MyCommand}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>