我有一个应用程序,用于从 Git 存储库中选择一些内容。
整个窗口有一个 ViewModel,在其中我定义了代表两个用户控件的视图模型 A 和 B 的两个实例。视图模型 B 是一个状态栏,其中只有一个字符串,用于显示可以是任何内容的文本。视图模型 A 是另一个用户控件,我可以在其中搜索用户故事。所以基本上我想在 UI 中的视图模型 B 中显示视图模型 A 的总计。我尝试将 VM B 注入 A,但这没有反映在窗口中。我如何使用 WPF MVVM 模式解决此问题?
通过你给出的解释很难理解你想要实现的目标。但是,据我了解,您有一个 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"/>
这种方法确保您可以在窗口内有效管理多个视图和视图模型,每个内容区域都绑定到其各自的视图模型。