0

我有一个 UWP MVVM 应用程序,其中我将以下属性绑定到一个DataGridComboBoxColumn

public List<ComboBoxValues> ListValues { get; set; } = new List<ComboBoxValues>();

XAML:

xmlns:local="using:MyProject.ViewModels"
    <controls:DataGridComboBoxColumn Header="myHeader"
        Binding="{Binding theSelectedValue, Mode=TwoWay}"
        ItemsSource="{x:Bind local:PageVM.ListValues, Mode=OneWay}"
        DisplayMemberPath="theValueOptions"/>

我使用依赖注入,在需要时使用 Autofac 生成我的 viewModel 的实例:

var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<PageVM>().AsSelf();

我得到了错误: Static method 'ListValues' not found in type 'PageVM'.我试过用谷歌搜索它,我发现的唯一结果是绑定到静态属性等不应该那么容易。

为什么 x:bind 需要一个静态方法?我不想使用静态属性/方法。

编辑:

DataContext页面也使用带有代码的 NavigationService 和 ViewModelBinder 设置,但不是代码隐藏页面。Autofac,IoC 管理这些实例,NavigationService 和 ViewModelBinder。因此,我不知道如何将 XAML 链接到这些实例以使用 x:Bind?

我不想在后面使用代码,因为我试图严格遵守 MVVM。

4

1 回答 1

1

是的,所以问题出在下面一行:

ItemsSource="{x:Bind local:PageVM.ListValues, Mode=OneWay}"

您对这段代码所做的是,告诉 xaml在 下BindingEngine查找一个名为的类PageVMxmlns:local然后查找一个名为ListValues. 现在,由于我们没有PageVM(根据上述行)的实例,它正在考虑ListValuesstatic试图找到它。

通常要绑定到一个ViewModel,你设置DataContextPageUserControl。你可以这样做:

<Page.DataContext>
    <local:PageVM x:Name="ViewModel"/>
</Page.DataContext>

如果您使用的UserControl是上述内容,则如下所示:

<UserControl.DataContext>
    <local:PageVM x:Name="ViewModel"/>
</UserControl.DataContext>

现在在xaml如下代码中使用它:

<controls:DataGridComboBoxColumn Header="myHeader"
    Binding="{Binding theSelectedValue, Mode=TwoWay}"
    ItemsSource="{x:Bind ViewModel.ListValues, Mode=OneWay}"
    DisplayMemberPath="theValueOptions"/>

注意x:Name="ViewModel", 作为 DataContext 的一部分。这将允许您ViewModel通过 the来引用您的codebehind

编辑后评论

或者,如果你不能有一个公共的无参数构造函数,那么我建议你使用代码隐藏来创建一个 ViewModel 的实例,如下所示:

public PageVM ViewModel => this.DataContext as PageVM;

没有对上述属性执行空检查的子句,因为从注释中,数据上下文是通过依赖注入框架设置的

然后在您的 xaml 代码中以相同的方式使用它:

ItemsSource="{x:Bind ViewModel.ListValues, Mode=OneWay}"
于 2021-01-14T22:15:15.613 回答