You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF MVVM:如何向子ViewModel传递选中的公司编号参数

解决方案

完全可以从父窗口取值,创建带参数构造函数的ViewModel并绑定到UserControl,这是WPF中传递参数到子组件的常用方案,比单纯通过Frame的Source属性绑定XAML路径更灵活。

核心思路

原方案通过绑定CurrentFrame字符串路径导航,WPF会自动实例化UserControl,但无法控制ViewModel的构造参数。我们需要改为手动创建UserControl并设置其DataContext,同时将父VM中选中的SelectedCompanyNum传递给子VM的构造函数。

具体实现步骤

1. 在父ViewModel中添加导航事件(遵循MVVM原则)

避免ViewModel直接引用View元素,通过事件通知View执行导航操作:

public class WINDOWCompaniesVM : _BASEVIEWMODEL
{
    // 新增导航事件
    public event EventHandler<NavigationArgs> NavigateRequested;

    // 导航参数类
    public class NavigationArgs : EventArgs
    {
        public int? TargetIndex { get; set; }
        public int? CompanyNum { get; set; }
    }

    // 修改GoToFrame方法
    public void GoToFrame(string parameter)
    {
        int convertedIndex = Convert.ToInt32(parameter);
        
        // 导航到公司新闻页面(索引8)
        if (convertedIndex == 8)
        {
            // 校验是否选中公司
            if (SelectedCompanyNum == 0)
            {
                // 可添加提示用户选择公司的逻辑,此处省略
                return;
            }
            // 触发导航事件,传递公司编号
            NavigateRequested?.Invoke(this, new NavigationArgs
            {
                TargetIndex = convertedIndex,
                CompanyNum = SelectedCompanyNum
            });
        }
        else
        {
            // 其他页面沿用原Source绑定逻辑
            NavigateFramesVM.GetFrame(convertedIndex);
            CurrentFrame = NavigateFramesVM.NFCurrentFrame;
            NavigateRequested?.Invoke(this, new NavigationArgs
            {
                TargetIndex = convertedIndex
            });
        }
    }

    // 其他原有代码保持不变...
}

2. 在父窗口的代码后台处理导航事件

订阅ViewModel的导航事件,根据事件参数创建对应的UserControl并设置DataContext:

public partial class WINDOWCompanies : Window
{
    public WINDOWCompanies()
    {
        InitializeComponent();
        var vm = (WINDOWCompaniesVM)DataContext;
        // 订阅导航事件
        vm.NavigateRequested += OnNavigateRequested;
    }

    private void OnNavigateRequested(object sender, WINDOWCompaniesVM.NavigationArgs e)
    {
        if (e.TargetIndex == 8 && e.CompanyNum.HasValue)
        {
            // 手动创建公司新闻UserControl,并绑定带参数的ViewModel
            var newsUC = new COMPANYNews(); // 替换为你的UserControl实际类名
            newsUC.DataContext = new COMPANYNewsVM(e.CompanyNum.Value);
            // 设置Frame的Content
            PageUCContent.Content = newsUC;
        }
        else if (e.TargetIndex.HasValue)
        {
            // 其他页面恢复Source绑定方式
            var vm = (WINDOWCompaniesVM)sender;
            PageUCContent.Source = new Uri(vm.CurrentFrame, UriKind.Relative);
        }
    }
}

3. 确保UserControl的DataContext绑定正确

在COMPANYNews.xaml中,确保DataContext已正确绑定(通常无需额外操作,因为我们已经在代码后台手动设置):

<UserControl x:Class="YourNamespace.COMPANYNews"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d">
    <!-- 你的UI元素,绑定到COMPANYNewsVM的属性,例如: -->
    <ListView ItemsSource="{Binding CompanyNewsList}">
        <!-- ListView模板 -->
    </ListView>
</UserControl>

关键说明

  • 这种方式完全符合MVVM设计原则,ViewModel不直接依赖View元素,通过事件实现解耦。
  • 可以灵活传递任意参数给子ViewModel,满足复杂业务场景需求。
  • 若其他页面也需要传递参数,可扩展NavigationArgs类添加更多字段。

内容的提问来源于stack exchange,提问作者Progolfer79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:03:12