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
。如果命令在 window 的 DataContext
中定义,则使用 ElementName
或 RelativeSource
:
<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>
我按原样知道我的命令,没有找到正确的路径。
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
。如果命令在 window 的 DataContext
中定义,则使用 ElementName
或 RelativeSource
:
<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>