【问题标题】:Binds not updating when messaging between view models using MVVMLight.Messaging使用 MVVMLight.Messaging 在视图模型之间进行消息传递时绑定不更新
【发布时间】:2020-01-28 01:19:03
【问题描述】:

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

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

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

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

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

类 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】:

    我找到了一种解决方法,但这似乎更像是一种 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");
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2014-10-07
      相关资源
      最近更新 更多