【问题标题】:StackOverflow When Trying to Create a New ViewModel in Caliburn.Micro尝试在 Caliburn.Micro 中创建新 ViewModel 时的 StackOverflow
【发布时间】:2020-01-19 08:21:14
【问题描述】:

过去几天我一直在尝试创建一个新的视图模型并将其显示在我的应用程序的主 shellview 上。目前,我已经能够使用ActivateItemAsync 加载页面,但这会占据整个页面。我目前希望它位于活动项之上。这是页面的视图:

  <!-- Notification Bar -->
  <UserControl 
            x:Name="NotificationMessage"
            Visibility="{Binding IsNotificationMessageVisible, Converter={StaticResource BooleanToVisibilityConverter}, FallbackValue=collapsed}"
            Grid.Row="0" Grid.Column="1"

            />


        <!-- Main Frame -->
        <Frame 
               x:Name="ActiveItem"  
               NavigationUIVisibility="Hidden" 
               Padding="10"
            Grid.Row="1"
            Grid.Column="1"
               />

从上面可以看到,我有两行,其中一行是通知栏,如果用户收到通知,就会出现。我目前希望只有在通知可用时才隐藏它。但是,我无法让通知显示在页面中。当我尝试时,由于它循环而收到堆栈溢出通知。下面是上述视图的 ViewModel 代码:

私人_notificationtMessage;

    public NotificationViewModel NotificationMessage
    {
        get {
            _notificationtMessage= new NotificationViewModel ();
            return _notificationtMessage; 
        }
        set { 
            _notificationtMessage= value;
            NotifyOfPropertyChange(() => NotificationMessage);
            NotifyOfPropertyChange(() => IsNotificationVisible);
        }
    }



    public bool IsNotificationVisible
    {
        get
        {
            bool b = false;
            if(Database.GetNotification().Title.Length !=0)
            {
                b = true;
                this.NotificationMessage = new NotificationViewModel ();
            }
            return b;
        }
    }

我的主要问题是如何在我的 ShellViewModel 中创建此模型的新实例并将其显示在我的 ShellView 中?

【问题讨论】:

  • 这个类在 IsNotificationVisible 属性 getter 被调用时实例化自己,可能是你的堆栈溢出发生的地方
  • SO 异常的原因是这一行NotifyOfPropertyChange(() =&gt; IsNotificationVisible);,您通知IsNotificationVisible 属性更改并且它更新NotificationMessage,它再次更新IsNotificationVisible 并进入无限循环。通知IsNotificationVisible更改NotificationMessage的原因是什么?通常你需要通知属性,当可见性改变时,反之亦然
  • @Charleh @PavelAnikhouski 谢谢,删除 NotifyOfPropertyChange(() =&gt; IsNotificationVisible); 停止了递归循环!太感谢了。我不再收到 stackOverflow 错误。但是,即使Database.GetNotification().Title.Length !=0 为真,NotificationMessage 仍然没有显示。

标签: c# wpf caliburn.micro


【解决方案1】:

您不应该在 getter 中创建对象。试试这个,并确保您已根据约定为NotificationViewModel 定义了一个视图:

private NotificationViewModel _notificationtMessage = new NotificationViewModel();
public NotificationViewModel NotificationMessage
{
    get
    {
        return _notificationtMessage;
    }
    set
    {
        _notificationtMessage = value;
        NotifyOfPropertyChange(() => NotificationMessage);
        NotifyOfPropertyChange(() => IsNotificationVisible);
    }
}


public bool IsNotificationVisible
{
    get
    {
        return Database.GetNotification().Title.Length != 0;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多