如何在 WPF MVVM 中从另一个 ViewModel 更新 ViewModel?

问题描述 投票:0回答:1

我有一个应用程序,用于从 Git 存储库中选择一些内容。

这是应用程序的基本设计

整个窗口有一个 ViewModel,在其中我定义了代表两个用户控件的视图模型 A 和 B 的两个实例。视图模型 B 是一个状态栏,其中只有一个字符串,用于显示可以是任何内容的文本。视图模型 A 是另一个用户控件,我可以在其中搜索用户故事。所以基本上我想在 UI 中的视图模型 B 中显示视图模型 A 的总计。我尝试将 VM B 注入 A,但这没有反映在窗口中。我如何使用 WPF MVVM 模式解决此问题?

这是应用程序的实际设计。

c# wpf mvvm data-binding
1个回答
0
投票

通过你给出的解释很难理解你想要实现的目标。但是,据我了解,您有一个 ContentControl 或另一个具有 Content 属性的 UIElement。您可以添加另一个 ContentControl 并将窗口分成两个,这样窗口就有两个 ContentControl。

<Window.DataContext>
    <StaticResource ResourceKey="ViewModelCollection" />
</Window.DataContext>
...
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="500" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <ContentControl
        Grid.Column="0"
        Grid.Row="0"
        Content="{Binding MainView.CurrentView}">
    </ContentControl>

    <ContentControl
        Grid.Column="0"
        Grid.Row="1"
        Content="{Binding StatusBar.CurrentView}">
    </ContentControl>
</Grid>

要同时显示两个不同的当前视图,您需要向项目中添加另一个类。例如,您可以使用 RelayCommand 创建 StatusBarViewModel 类,以将状态栏的 CurrentView 设置为适当的 UserControl。

此外,您可以创建一个 ViewModelCollection 类,将 MainViewModel 和 StatusBarViewModel 作为属性:

class ViewModelCollection
{
    public ViewModelCollection()
    {
        MainView = new MainViewModel();
        StatusBar = new StatusBarViewModel();
    }

    private MainViewModel _MainView;
    private StatusBarViewModel _StatusBar;

    public MainViewModel MainView
    {
        get { return _MainView; }
        set { _MainView = value; }
    }

    public StatusBarViewModel StatusBar
    {
        get { return _StatusBar; }
        set { _StatusBar = value; }
    }
}

不要忘记在 App.xaml 中引用 ViewModelCollection 并将其设置为窗口的 DataContext:

<viewModel:ViewModelCollection x:Key="ViewModelCollection"/>

这种方法确保您可以在窗口内有效管理多个视图和视图模型,每个内容区域都绑定到其各自的视图模型。

© www.soinside.com 2019 - 2024. All rights reserved.