绑定两个不同ViewModel的属性

时间:2015-04-13 18:21:24

标签: c# wpf mvvm binding viewmodel

我再次遇到问题:

我有两个现有的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中的插件。

如何安排?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

ObservableCollection<Plug> Plugs
Plug SelectedPlug

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