MVVM通过单独的视图模型在两个用户控件之间绑定



我有一个窗口,该窗口可加载客户表和另一个用户对输入字段的控制,当我选择时,我希望填充用户控件输入。我目前有一个数据杂志,即通过绑定在CustomerviewModel中设置了所选项目。当选择此过程时,它会更新带有所选项目属性(例如名称,电子邮件等(的文本框。我有一个包含多个输入字段的CultiansettingsViewModel。我正在尝试将所选项目绑定到此模型中的输入,但是由于CustomerviewModel不了解customertingsetsviewmodel,因此我看不到文本框输入中的绑定。

使用datatype使用DataTemplate加载视图。

mainwindow.xaml

    <Window.Resources>
            <DataTemplate  DataType="{x:Type VM:CustomerVM}">
                <View:Customers/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type VM:CustomerSettingsVM}">
                <View:CustomerSettings />
            </DataTemplate>
            <DataTemplate DataType="{x:Type VM:SuppliersVM}">
                <View:Suppliers/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type VM:SuppliersSettingsVM}">
                <View:SupplierSettings/>
            </DataTemplate>
        </Window.Resources>
<ContentControl Content="{Binding SelectedMain}"  Margin="0,135,0,10" Grid.ColumnSpan="2"/>
<ContentControl Content="{Binding SelectedSettings}"  Margin="105,53,10,45"/>

这些设置并根据所呈现的数据类型获得正确的视图。

mainvm.cs

Customer = new CustomerVM();
CustomerSettings = new CustomerSettingsVM();
SelectedMain = Customer;
SelectedSettings = CustomerSettings;

CustomerVM中,我有一个与客户视图中任何内容的绑定在一起的绑定,但是我如何获取客户设置视图以查看所选客户已更改并填充输入?

customerv.cs

 public Customer SelectedCustomer
        {
            get { return _selectedCustomer; }
            set
            {
                _selectedCustomer = value;
                RaisePropertyChangedEvent("SelectedCustomer");
            }
        }

我已经将问题的简单解决方案上传到github可能会更好地了解我要实现的目标

我认为您错过了有关MVVM的一些概念,也许您应该回到基础上。基本上,您的ViewModels必须是您视图的"可测试副本"。因此,如果您的目标是构建包含客户设置的客户视图,那么您需要的是:

  • 带有cunitustertingsviewModel属性的自定义服务模型
  • 使用CustomerviewModel作为DataContext
  • 的自定义服务
  • customerettingsview从customertingsviewmodel bended bended the customerviewModel

另一种方法:如果您希望一个视图包含另一个视图,则可以拥有一个ViewModel来包含另一个ViewModel。

这个另一个问题可能会向您展示如何使用VM作为另一个VM的属性。

请使用您的github示例查看我建议的解决方案。基本上,您的问题是,您不应在视图中直接使用客户模型,而是创建一个自定义服务,而只是删除客户eTtingVm。您可以通过阅读我如何处理MVVM来了解我的实现。

希望它有帮助。

最新更新