首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NotifyPropertyChanged和ContentControl

NotifyPropertyChanged和ContentControl
EN

Stack Overflow用户
提问于 2018-09-10 17:46:47
回答 1查看 184关注 0票数 2

我为我的问题挣扎了一个星期,我无法解决它。我正在编写一个具有一个窗口(MainView)的MVVM应用程序。在这个Mainview中,我想在需要的时候加载不同的UserControl。在Application-Startup中,我正在加载MainViewModel。在MainViewModel的构造函数中,我正在加载第一个ViewModel (LoginViewModel)。因为我的MainView.xaml,它显示了我的Login-User-Control,如我所愿。所以在这之前一切都很好。在ActivePanel-class中,我保存的是CurrentView,因为在我的MainView.xaml中,我为ContentControl做了一个绑定到我的CurrentView。因此,除了视图的更改之外,一切都正常工作,尽管我的CurrentViewCurrentView方法正在工作。我在想,我的错误是在xaml (DataBinding)。希望你们能帮我。

这是我的MainView.xaml,我想在其中加载不同的DataTemplates。正如我之前说过的:通过MainViewModel的构造函数加载MainViewModel是可行的。向其他VieModels的转换也是有效的,但是DataBinding到ContentControl是这里的大问题。

代码语言:javascript
复制
<Window x:Class="App.View.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:App.View"
        mc:Ignorable="d"
        xmlns:viewmodels="clr-namespace:App.ViewModels"
        xmlns:views="clr-namespace:App.View"
        xmlns:helper="clr-namespace:App.Helper"
        Title="Betrooms" Height="500" Width="350">

    <Window.Resources>
        <DataTemplate x:Name="LoginUCTemplate" DataType="{x:Type viewmodels:LoginViewModel}">
            <views:LoginUC DataContext="{Binding}"/>
        </DataTemplate>

        <DataTemplate x:Name="RegUCTemplate" DataType="{x:Type viewmodels:RegViewModel}">
            <views:RegUC DataContext="{Binding}"/>
        </DataTemplate>

        <DataTemplate x:Name="HomeUCTemplate" DataType="{x:Type viewmodels:HomeViewModel}">
            <views:HomeUC DataContext="{Binding}"/>
        </DataTemplate>
    </Window.Resources>

    <Window.DataContext>
        <viewmodels:ActivePanel/>
    </Window.DataContext>

    <Grid>
        <ContentControl Content="{Binding CurrentView, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
    </Grid>
</Window>

这是我的ActivePanel类,在那里我保存关于哪个ViewModel是活动的信息。CurrentView是我要绑定Content的属性。

代码语言:javascript
复制
namespace APP.ViewModels
{
    public class ActivePanel : NotifyPropertyChanged
    {
        private object _currentView;

        public object CurrentView
        {
            get { return _currentView; }
            set
            {
                if (value != _currentView)
                {
                    _currentView = value;
                    OnPropertyChanged("CurrentView");
                }
            }
        }
    }
}

这是我的MainViewModel

代码语言:javascript
复制
namespace App.ViewModels
{
    public class MainViewModel : ActivePanel
    {
        private LoginViewModel _loginViewModel;

        public MainViewModel()
        {
            _loginViewModel = new LoginViewModel();
            CurrentView = _loginViewModel;
        }
    }
}

这是我的LoginViewModel,在这里,我通过一个操作来改变CurrentView的值:

代码语言:javascript
复制
namespace App.ViewModels
{
    public class LoginViewModel : ActivePanel
    {
        #region Member
        private string _username;
        private string _password;
        bool login = false;

        private HomeViewModel _homeViewModel;
        private RegViewModel _regViewModel;

        UserModel User = new UserModel();
        #endregion

        #region Properties
        public ICommand RegActionCommand { get; set; }
        public ICommand LogActionCommand { get; set; }

        public string GetUsername
        {
            get { return _username; }
            set
            {
                if (value != _username)
                {
                    _username = value;
                    OnPropertyChanged("GetUsername");
                }
            }
        }

        public string GetPassword
        {
            get { return _password; }
            set
            {
                if (value != _password)
                {
                    _password = value;
                    OnPropertyChanged("GetPassword");
                }
            }
        }
        #endregion

        #region Constructor
        public LoginViewModel()
        {
            this.RegActionCommand = new RelayCommand(RegAction);
            this.LogActionCommand = new RelayCommand(LogAction);
        }
        #endregion

        #region Button-Action
        private void LogAction(object obj)
        {               
                _homeViewModel = new HomeViewModel();
                CurrentView = _homeViewModel;
        }

        private void RegAction(object obj)
        {
            _regViewModel = new RegViewModel();
            CurrentView = _regViewModel;
        }
        #endregion           
    }
}

我希望我的问题是可以理解的:ContenControl绑定被设置为CurrentView,但是ContentControl永远不会改变,尽管CurrentView的属性正在改变。

多亏了你们所有人。干杯保罗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 06:45:25

在命令处理程序中,要更改LoginViewModelLoginViewModel属性。然而,ContentControlDataContextMainViewModel,因此它的内容绑定到MainViewModelCurrentView属性。

您需要在命令处理程序中设置MainViewModel的属性。有不同的实现方法,例如,您可以向LoginViewModel添加一个构造函数参数,以传递给MainViewModel的引用。您可以保存此引用,然后在命令处理程序中访问它。

另一种可能是从LoginViewModel中的命令引发事件或发送消息,并在MainViewModel中处理它。这将减少ViewModels之间的耦合,但取决于您使用的机制和库,它可能要复杂一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52262973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档