在使用MVVMLight.Messaging的视图模型之间进行消息传递时,绑定未更新

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

我正在尝试从另一个视图模型设置视图模型中选项卡项目的可见性。

我知道绑定是正确的,因为我可以在新模型的构造函数中设置属性(设置为false),并且它们按我的意愿出现/消失(将某些设置为true)。

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

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

将消息从第一个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();
        }

Class TabVisibility

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Analytics_Module.Messages
{
    class TabVisibility
    {
        public bool SuitesReportVisible { get; set; }
        public bool TenantRankingsVisible { get; set; }
        public bool IndustryReportVisible { get; set; }
        public bool SubmarketBreakdownVisible { get; set; }
    }
}

新视图(包含在第一种方法创建的新窗口中)

<UserControl x:Class="Analytics_Module.Views.TabsReportView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Analytics_Module.Views"
             xmlns:viewModel="clr-namespace:Analytics_Module.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
        <viewModel:TabsReportViewModel x:Key="vmTabsReport" />
    </UserControl.Resources>
    <Grid DataContext="{Binding Source={StaticResource vmTabsReport}}">
        <TabControl SelectedIndex="{Binding SelectedReportIndex}" >
            <TabItem Header="Search Parameteres" >
                <ContentControl Margin="0,10,0,5" Name="TabContentReportSearchParameters" />
            </TabItem>
            <TabItem Header="Suites Report" 
                     Visibility="{Binding VisibilitySuitesReportTab, 
                             Converter={StaticResource BooleanToVisibilityConverter}}"
                     IsSelected="{Binding VisibilitySuitesReportTab}">
                <ContentControl Name="TabContentReportSuites" />
            </TabItem>
            <TabItem Header="Tenant Rankings" Visibility="{Binding VisibilityTenantRankingsTab, 
                             Converter={StaticResource BooleanToVisibilityConverter}}">
                <ContentControl Margin="0,10,0,5" Name="TabContentReportTenantRankings" />
            </TabItem>
            <TabItem Header="Industry Breakdown" Visibility="{Binding VisibilityIndustryBreakdownTab, 
                             Converter={StaticResource BooleanToVisibilityConverter}}">
                <ContentControl Name="TabContentReportIndustryBreakdown" />
            </TabItem>
            <TabItem Header="Submarket Breakdown" Visibility="{Binding VisibilitySubmarketBreakdownTab, 
                             Converter={StaticResource BooleanToVisibilityConverter}}">
                <ContentControl Name="TabContentReportSubmarketBreakdown" />
            </TabItem>

        </TabControl>
    </Grid>
</UserControl>

新视图后面的代码

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();
        }
    }
}

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; }
    }
}
c# mvvm data-binding mvvm-light
1个回答
0
投票

我找到了一种解决方法,但这似乎更像是一种hack。我要做的就是为每个属性手动触发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");

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