C# 使用MVVMLight.messaging在视图模型之间发送消息时绑定不更新

C# 使用MVVMLight.messaging在视图模型之间发送消息时绑定不更新,c#,mvvm,data-binding,mvvm-light,C#,Mvvm,Data Binding,Mvvm Light,我正在尝试从另一个viewmodel设置viewmodel中选项卡项的可见性 private void GenerateWindowedReport() { Console.WriteLine("Executing View Windowed Report"); Window ReportWindow = new ReportWindow(); var msg = new TabVisib

我正在尝试从另一个viewmodel设置viewmodel中选项卡项的可见性

        private void GenerateWindowedReport()
        {
            Console.WriteLine("Executing View Windowed Report");

            Window ReportWindow = new ReportWindow();

            var msg = new TabVisibility() {
                SuitesReportVisible = IncludeReportSuites,
                TenantRankingsVisible = IncludeReportTenantRanking,
                IndustryReportVisible = IncludeReportIndustry,
                SubmarketBreakdownVisible = IncludeReportSubmarket
            };

            Messenger.Default.Send<TabVisibility>(msg);
            ReportWindow.Show();
        }
我知道绑定是正确的,因为我可以在新模型的构造函数中设置属性(设置为false),它们会按照我的意愿出现/消失(将一些设置为true)

我知道messenger正在为我工作,我可以注册在构造函数中等待消息,并在同一个构造函数中发送消息,该消息由我的消息回调处理,绑定正确更新(我可以看到最初设置为false的选项卡)

我知道这不是竞争条件,因为我设置了控制台写入行,并查看了每一行的调用顺序。创建窗口->注册消息回调->创建消息并发送

将调用从第一个ViewModel向新ViewModel中的第二个my回调发送消息并更改属性,但视图不会更改(隐藏的内容保持隐藏)

方法从原始viewmodel

        private void GenerateWindowedReport()
        {
            Console.WriteLine("Executing View Windowed Report");

            Window ReportWindow = new ReportWindow();

            var msg = new TabVisibility() {
                SuitesReportVisible = IncludeReportSuites,
                TenantRankingsVisible = IncludeReportTenantRanking,
                IndustryReportVisible = IncludeReportIndustry,
                SubmarketBreakdownVisible = IncludeReportSubmarket
            };

            Messenger.Default.Send<TabVisibility>(msg);
            ReportWindow.Show();
        }
新视图(包含在第一个方法中创建的新窗口中)


新视图背后的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Analytics_Module.Views
{
    /// <summary>
    /// Interaction logic for TabsReportView.xaml
    /// </summary>
    public partial class TabsReportView : UserControl
    {
        public TabsReportView()
        {
            InitializeComponent();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
名称空间分析\u模块视图
{
/// 
///TabsReportView.xaml的交互逻辑
/// 
公共部分类选项卡ReportView:UserControl
{
公共选项卡ReportView()
{
初始化组件();
}
}
}
ViewModel给我带来的问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Analytics_Module.Messages;
using Analytics_Module.Utillity;
using MVVMLight.Messaging;

namespace Analytics_Module.ViewModels
{
    class TabsReportViewModel : BaseViewModel
    {
        protected static class TabIndexConstants
        {
            public const int SearchParameters = 0;
            public const int SuitesReport = 1;
            public const int TenantRankings = 2;
            public const int IndustryBreakdown = 3;
            public const int SubmarketBreakdwown = 4;
        }
        public TabsReportViewModel() : base()
        {
            Console.WriteLine("TabsreportVM Constructor");
            SelectedReportIndex = TabIndexConstants.SearchParameters;
            VisibilitySuitesReportTab = false;
            VisibilityTenantRankingsTab = false;
            VisibilityIndustryBreakdownTab = false;
            VisibilitySubmarketBreakdownTab = false;

            Messenger.Default.Register<TabVisibility>
                (this, (msgTabVisibility) => SetTabVisibility(msgTabVisibility));

            Console.WriteLine("Message Registered");

            TabVisibility t = new TabVisibility();
            t.IndustryReportVisible = true;
            t.SubmarketBreakdownVisible = true;
            t.SuitesReportVisible = true;
            t.TenantRankingsVisible = true;

            //SetTabVisibility(t);

            //Messenger.Default.Send<TabVisibility>(t);
        }


        public void SetTabVisibility(TabVisibility msgTabVisibility)
        {
            Console.WriteLine("Tabs Set Visiblity Callback");

            VisibilitySuitesReportTab = (bool) msgTabVisibility.SuitesReportVisible;
            VisibilityTenantRankingsTab = (bool) msgTabVisibility.TenantRankingsVisible;
            VisibilityIndustryBreakdownTab = (bool) msgTabVisibility.IndustryReportVisible;
            VisibilitySubmarketBreakdownTab = (bool)msgTabVisibility.SubmarketBreakdownVisible;

        }


        public int SelectedReportIndex { get; set; }
        public bool VisibilitySuitesReportTab { get; set; }
        public bool VisibilityTenantRankingsTab { get; set; }
        public bool VisibilityIndustryBreakdownTab { get; set; }
        public bool VisibilitySubmarketBreakdownTab { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Analytics_Module.Messages;
使用Analytics_Module.Utillity;
使用MVVMLight.Messaging;
名称空间分析\u Module.ViewModels
{
类选项卡ReportViewModel:BaseViewModel
{
受保护的静态类TabIndexConstants
{
public const int SearchParameters=0;
公用常数int SuitesReport=1;
公共建筑内部租户=2;
工业区公共建筑=3;
公共常数int SubmarketBreakdwown=4;
}
公共选项卡ReportViewModel():base()
{
Console.WriteLine(“TabsreportVM构造函数”);
SelectedReportIndex=TabIndexConstants.SearchParameters;
VisibilitySuitesReportTab=false;
VisibilityTenantTrankingStab=假;
VisibilityIndustryBreakdownTab=false;
VisibilitySubmarketBreakdownTab=false;
Messenger.Default.Register
(此(msgTabVisibility)=>SetTabVisibility(msgTabVisibility));
Console.WriteLine(“消息注册”);
TabVisibility t=新TabVisibility();
t、 IndustryReportVisible=真;
t、 SubmarketBreakdownVisible=真;
t、 SuitesReportVisible=true;
t、 TenantTrankingsVisible=true;
//设置可见性(t);
//Messenger.Default.Send(t);
}
public void SetTabVisibility(TabVisibility msgTabVisibility)
{
Console.WriteLine(“选项卡设置可见回调”);
VisibilitySuitesReportTab=(bool)msgTabVisibility.SuitesReportVisible;
VisibilityTenantTrankingStab=(bool)msgTabVisibility.TenantTrankingsVisible;
VisibilityIndustryBreakdownTab=(bool)msgTabVisibility.IndustryReportVisible;
VisibilitySubmarketBreakdownTab=(bool)msgTabVisibility.SubmarketBreakdownVisible;
}
public int SelectedReportIndex{get;set;}
public bool VisibilitySuitesReportTab{get;set;}
公共bool VisibilityTenantTrankingStab{get;set;}
public bool VisibilityIndustryBreakdownTab{get;set;}
public bool VisibilitySubmarketBreakdownTab{get;set;}
}
}

我找到了一个解决办法,但这更像是一个黑客行为。我所要做的就是手动触发每个属性的
OnPropertyChanged

public void SetTabVisibility(MessageTabVisibility msgTabVisibility)
{
    Console.WriteLine("Tabs Set Visiblity Callback");

    VisibilitySuitesReportTab = (bool) msgTabVisibility.SuitesReportVisible;
    VisibilityTenantRankingsTab = (bool) msgTabVisibility.TenantRankingsVisible;
    VisibilityIndustryBreakdownTab = (bool) msgTabVisibility.IndustryReportVisible;
    VisibilitySubmarketBreakdownTab = (bool)msgTabVisibility.SubmarketBreakdownVisible;

    Messenger.Default.Unregister<MessageTabVisibility>(this);

    Console.WriteLine("Refresh");
    OnPropertyChanged("VisibilitySuitesReportTab");
    OnPropertyChanged("VisibilityTenantRankingsTab");
    OnPropertyChanged("VisibilityIndustryBreakdownTab");
    OnPropertyChanged("VisibilitySubmarketBreakdownTab");

}
public void SetTabVisibility(MessageTabVisibility msgTabVisibility)
{
Console.WriteLine(“选项卡设置可见回调”);
VisibilitySuitesReportTab=(bool)msgTabVisibility.SuitesReportVisible;
VisibilityTenantTrankingStab=(bool)msgTabVisibility.TenantTrankingsVisible;
VisibilityIndustryBreakdownTab=(bool)msgTabVisibility.IndustryReportVisible;
VisibilitySubmarketBreakdownTab=(bool)msgTabVisibility.SubmarketBreakdownVisible;
Messenger.Default.Unregister(此选项);
控制台写入线(“刷新”);
OnPropertyChanged(“VisibilitySuitesReportTab”);
房地产变更(“VisibilityTenantTrankingStab”);
OnPropertyChanged(“VisibilityIndustryBreakdown选项卡”);
OnPropertyChanged(“VisibilitySubmarketBreakdown选项卡”);
}
public void SetTabVisibility(MessageTabVisibility msgTabVisibility)
{
    Console.WriteLine("Tabs Set Visiblity Callback");

    VisibilitySuitesReportTab = (bool) msgTabVisibility.SuitesReportVisible;
    VisibilityTenantRankingsTab = (bool) msgTabVisibility.TenantRankingsVisible;
    VisibilityIndustryBreakdownTab = (bool) msgTabVisibility.IndustryReportVisible;
    VisibilitySubmarketBreakdownTab = (bool)msgTabVisibility.SubmarketBreakdownVisible;

    Messenger.Default.Unregister<MessageTabVisibility>(this);

    Console.WriteLine("Refresh");
    OnPropertyChanged("VisibilitySuitesReportTab");
    OnPropertyChanged("VisibilityTenantRankingsTab");
    OnPropertyChanged("VisibilityIndustryBreakdownTab");
    OnPropertyChanged("VisibilitySubmarketBreakdownTab");

}