Xaml 如何使用与数据模板不同的数据类型的x:Bind

Xaml 如何使用与数据模板不同的数据类型的x:Bind,xaml,mvvm,data-binding,uwp,prism,Xaml,Mvvm,Data Binding,Uwp,Prism,我正在开发一个名为“Familify”的视图,该视图向用户显示资产列表,并允许他们从列表中删除资产。资产存储在ViewModel中的ObservableCollection中,因此删除命令只需获取资产对象并将其从集合中删除。我在使用“删除”功能时遇到问题。以下是XAML和代码隐藏: Familify.xaml 其想法是,单击该按钮将从列表中删除资产。需要注意的是,显示数字、类型等的正常装订工作正常。到目前为止,我的想法是: 尝试使用绑定访问存储在页面视图模型中的RemoveAssetComman

我正在开发一个名为“Familify”的视图,该视图向用户显示资产列表,并允许他们从列表中删除资产。资产存储在ViewModel中的ObservableCollection中,因此删除命令只需获取资产对象并将其从集合中删除。我在使用“删除”功能时遇到问题。以下是XAML和代码隐藏:

Familify.xaml

其想法是,单击该按钮将从列表中删除资产。需要注意的是,显示数字、类型等的正常装订工作正常。到目前为止,我的想法是:

尝试使用绑定访问存储在页面视图模型中的RemoveAssetCommand。但是,我无法让祖先绑定起作用,也就是说,尝试查找XAML层次结构中更高级别的元素的数据上下文不起作用,因为findAncestor在UWP中不是一个东西。 x:Bind看起来是个不错的解决方案,因为它使用了指向属性的显式路径。因此,如果我在代码隐藏中声明ViewModel,我可以使用x:Bind ViewModel.property。一切都很好。我就是这么做的,intellisense允许我在键入ViewModel.RemoveAssetCommand时访问它。 但是,这不起作用,因为我得到了一个错误,没有为DataTemplate定义DataType。这很有道理,所以我尝试了两件事。 x:DataType=Models:Asset放在上面的DataTemplate标记中是数据模板中显示的模型,所以我首先尝试了这个。当然,该命令不是在模型中声明的,而是在视图模型中声明的,所以这不起作用。 相反,我尝试了x:DataType=ViewModels:FamilifyViewModel,认为可以使用x:Bind。然而,我随后得到一个错误,它无法将类型为Asset的对象强制转换为FamilifyViewModel。这是有意义的,因为传递到此数据模板的对象的类型为Asset。 这是一种痛苦,因为我认为x:Bind可以工作的全部原因是我可以直接从codebehind中的ViewModel访问属性

明确地说,1是否可以在数据模板中使用x:Bind来访问基本级别属性(在本例中为ViewModel上的Prism命令)?有没有更好的方法来实现这个功能

是否可以在数据模板中使用x:Bind访问基本级别属性(在本例中为ViewModel上的Prism命令)

是的,如果要访问基本级别,可以按如下方式重新分配按钮的DataContext:

<Button DataContext="{Binding ElementName=Familily, Path=DataContext}"/>
Asset.cs

ViewModel.cs

namespace asset_manager.Views
{
    public sealed partial class Familify : UserControl
    {
        FamilifyViewModel ViewModel { get; set; }

        public Familify()
        {
            this.InitializeComponent();
            DataContextChanged += (s, e) =>
            {
                ViewModel = DataContext as FamilifyViewModel;
            };
        }
    }
}
<Button DataContext="{Binding ElementName=Familily, Path=DataContext}"/>
<Button 
    Command="{Binding RemoveAssetCommand}"
    CommandParameter="{Binding ElementName=MyListView, Path=ItemsSource}"
    Content="&#xE894;"
    FontFamily="Segoe MDL2 Assets"
    Grid.Column="4">
</Button>
public class Asset
{
    public string number { get; set; }
    public string type { get; set; }
    public ICommand RemoveAssetCommand
    {
        get
        {
            return new CommandHandler<ObservableCollection<Asset>>((item) => this.RemoveAction(item));
        }
    }
    private void RemoveAction(ObservableCollection<Asset> items)
    {
        items.Remove(this);
    }
}
public class FamilifyViewModel
{
    public ObservableCollection<Asset> Assets = new ObservableCollection<Asset>();
    public FamilifyViewModel()
    {
        Assets.Add(new Asset { number = "100001", type = "hello" });
        Assets.Add(new Asset { number = "100001", type = "hello" });
        Assets.Add(new Asset { number = "100001", type = "hello" });
        Assets.Add(new Asset { number = "100001", type = "hello" });
    }        
}