【问题标题】:Bind Properties of two different ViewModels绑定两个不同 ViewModel 的属性
【发布时间】:2015-04-13 18:21:23
【问题描述】:

我又遇到了一个问题:

我有两个现有的 MVVM 模式。 所有的 ViewModel 都基于 MVVM light 的 ViewModelBase。

PlugList - PlugListViewModel - PlugListView(显示插头列表) Plug - PlugViewModel - PlugView(显示特定插头的属性)

这两种视图已经在不同的地方使用过。 现在我需要另一个视图,它为我提供了一个合并两个 ViewModel 的窗口:

PlugListViewModel_Window - PlugListView_Window

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="5"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <View:View_PlugList x:Name="PlugListView" DataContext="{Binding Path=ViewModel_PlugList, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/>
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" />
    <View:View_Plug x:Name="PlugList" DataContext="{Binding ViewModel_Plug}" Grid.Column="2"/>
</Grid>

视图模型

class ViewModel_PlugListWindow : ViewModelBase
{
    public ViewModel_PlugListWindow()
    {
    }

    private const string ViewModel_PlugList_PropertyName = "ViewModel_PlugList";
    private ViewModel_PlugList _ViewModel_PlugList;
    public ViewModel_PlugList ViewModel_PlugList
    {
        get
        {
            return _ViewModel_PlugList;
        }
        set
        {
            _ViewModel_PlugList = value;
            RaisePropertyChanged(ViewModel_PlugList_PropertyName);
        }
    }

    private const string ViewModel_Plug_PropertyName = "ViewModel_Plug";
    private ViewModel_Plug _ViewModel_Plug;
    public ViewModel_Plug ViewModel_Plug
    {
        get
        {
            return _ViewModel_Plug;
        }
        set
        {
            _ViewModel_Plug = value;
            RaisePropertyChanged(ViewModel_Plug_PropertyName);
        }
    }
}

视图模型中的所有属性都定义如下:

private const string SelectedPlugPropertyName = "SelectedPlug";
private RaControlPlug _SelectedPlug;
public RaControlPlug SelectedPlug
{
    get
    {
        return _SelectedPlug;
    }
    private set
    {
        _SelectedPlug = value;
        RaisePropertyChanged(SelectedPlugPropertyName);
    }
}

PlugListView:

<UserControl x:Class="RaControlRuleConfig.View.View_PlugList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"               
             xmlns:ViewModel="clr-namespace:RaControlRuleConfig.ViewModel"
             xmlns:local="clr-namespace:RaControlRuleConfig"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <Button Content="Add Plug" Command="{Binding AddPlugCommand}"/>
        <ListView ItemsSource="{Binding PlugList}" SelectedItem="{Binding SelectedPlug}">
            <ListView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:RaControlPlug}">
                    <TextBlock Text="{Binding Name}"/>
                </HierarchicalDataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</UserControl>

现在我想将 PlugListViewModel 的变量绑定到 PlugViewModel。 (SelectedPlug 应该是 PlugViewModel 中的插件。

如何安排?

谢谢!

【问题讨论】:

  • Now I would like to bind a variable of PlugListViewModel to PlugViewModel. 这毫无意义。
  • 这不是我所知道的 MVVM。显然,您有一个模型到一个视图模型到一个视图。我不会说这是错误的,但它似乎不寻常。你能发布任何代码来显示你的 PlugListView 是如何组合在一起的吗?
  • 我为您提供了更多代码。这个人的做法是否正确? link

标签: c# wpf mvvm binding viewmodel


【解决方案1】:

你没有完全把模式弄对了。您的链接示例使用 MainViewModel 为 SingleUser 视图和 UserList 视图提供支持逻辑。因为它们使用相同的 ViewModel,所以两个 View 使用相同的属性值。视图之间没有通信,视图只是显示来自同一个 ViewModel 的数据。

您在上面发布的代码显示了两个 ViewModel 类,这是导致问题的原因。我认为,您应该有一个 ViewModel 类来处理所有与 Plug 相关的逻辑。这个 ViewModel 可能有:

ObservableCollection<Plug> Plugs
Plug SelectedPlug

其中 Plugs 是您发布的代码中 ListView 的 ItemsSource,而 SelectedPlug 是 SelectedItem。

【讨论】:

  • 所以不能在一个视图中使用我现有的 2 个视图吗?这不好,因为我必须生成一个完全等于其他两个组合的新视图。
  • 你可以。您需要将 2 个视图的 DataContext 设置为 相同的 ViewModel 以使其行为方式与您发布的链接中的代码相同。该 ViewModel 需要具有与您的 View 所需的属性相匹配的属性。
  • 那意味着我必须执行保存命令等两次? :(
  • 为什么要执行两次?
  • 因为 ViewModelPlugList 需要和 ViewModelPlugListWindow 一样的属性、命令……?
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2018-08-08
  • 2011-08-26
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多