目前使用MVVM Light Messanger,需要切换到XAML实例

时间:2016-02-22 00:53:48

标签: c# wpf xaml mvvm

所以目前为了更改我的MainWindow中的视图,我使用MVVM Light Messanger向我的MainWindow.xaml.cs发送消息,该消息执行以下操作:

public MainWindow()
        {
            InitializeComponent();
            Messenger.Default.Register<NavigateMessage>(this, (action) => ShowUserControl(action));
            this.DataContext = new MainWindowViewModel();
        }
        private void ShowUserControl(NavigateMessage nm)
        {
            Holder.Content = nm.View;
        }

这是将NavigateMessage发送到此Receiver端的代码:

var msg = new NavigateMessage { View = View, ViewModelType = ViewModelType, ViewType = ViewType };
Messenger.Default.Send<NavigateMessage>(msg);

但是,我正在调整其他一些代码来处理这个问题,但是我需要通过绑定到NavigateMessage对象的实例来设置Holder对象的内容,该对象将被定义和更新在App.xaml中

我该怎么做呢?我是否需要一个额外的类,我将在XAML中创建一个实例,该类将包含get,set属性,以便绑定到此实例的任何内容都会更新?

这就是我目前所拥有的:

namespace PhotoManagement
{
    public class ViewChange : Common.NotifyUIBase
    {
        private NavigateMessage _v;
        public NavigateMessage V
        {
            get { return _v; }
            set
            {
                if (_v != value)
                {
                    _v = value;
                    RaisePropertyChanged();
                }
            }
        }
    }
}

但是出现以下错误:

  

可访问性不一致:属性类型&#39; NavigateMessage&#39;少了   比财产更容易获得

NavigateMessage.cs

namespace PhotoManagement
{
    class NavigateMessage
    {
        public Type ViewType { get; set; }
        public Type ViewModelType { get; set; }
        public UserControl View { get; set; }
    }
}

修改 ----------------------------------------------- -------------------------

当我尝试运行它时,我的应用程序出现异常,我感觉这是由于我将内容添加到我的控件的方式:

<Controls:AnimatedContentControl Content="{StaticResource CurrentView}" Grid.Row="1" Grid.Column="1" />

这是StaticResource

<local:ViewChange x:Key="CurrentView" />

当然,下面是StaticResource实例关闭的类

namespace PhotoManagement
{
    public class ViewChange : Common.NotifyUIBase
    {
        private NavigateMessage _v;
        public NavigateMessage V
        {
            get { return _v; }
            set
            {
                if (_v != value)
                {
                    _v = value;
                    RaisePropertyChanged();
                }
            }
        }
    }
}

然后更新此实例:

var msg = new NavigateMessage { View = View, ViewModelType = ViewModelType, ViewType = ViewType };

//Replace XAML Instance with new View
((ViewChange)Application.Current.Resources["CurrentView"]).V = msg;

我认为我的ViewChange课程创建错误,因为内容调用不知道在V属性中查看,我该如何解决这个问题?我试过了

{StaticResource CurrentView.V}

然而,这只会导致另一个错误。

1 个答案:

答案 0 :(得分:1)

您忘记了public课程中的NavigateMessage访问修饰符。默认情况下,类为internal,因此比public更难访问。

这应该可以解决问题

public class NavigateMessage
{
    public Type ViewType { get; set; }
    public Type ViewModelType { get; set; }
    public UserControl View { get; set; }
}

您必须阅读错误消息,它已经告诉您:)