C# 使用MVVMLight.messaging在视图模型之间发送消息时绑定不更新
我正在尝试从另一个viewmodel设置viewmodel中选项卡项的可见性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
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");
}