导航mvvm灯

时间:2014-07-03 20:02:01

标签: c# wpf mvvm

有人可以告诉我为什么我不能再次更改页面?

例如,当我点击登录时,应用程序可以更改页面,即显示主面板,但是如果用户单击另一个按钮打开另一个面板则没有任何反应。

主窗口

<Window x:Class="Smart.Interface.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:Smart.Interface.View"
        xmlns:ViewModel="clr-namespace:Smart.Interface.ViewModel"
        Title="MainWindow" Height="768" Width="1024"
        DataContext="{Binding Login,
                              Source={StaticResource Locator}}"
        ResizeMode="NoResize">


    <Grid Background="#FFE6E7E8">
        <Rectangle Panel.ZIndex="0" Name="RetanguloTop" Fill="Black" HorizontalAlignment="Left" Height="35" Stroke="Black" VerticalAlignment="Top" Width="1024"/>
        <Rectangle Name="RetanguloFooter" Fill="Black" HorizontalAlignment="Left" Height="35" Margin="0,703,0,0" Stroke="Black" VerticalAlignment="Top" Width="1024"/>

        <ContentControl Content="{Binding CurrentViewModel}" />
    </Grid>
</Window>

第一个动作完美无缺 - &gt; CurrentViewModel = new PainelDeOpcoesViewModel();

但在视图PainelDeOpcoesView中,我无法再访问任何其他视图,也可以使用同样的想法。

CurrentViewModel = new GerenciarUsuariosViewModel();&lt; - 它不起作用

private ViewModelBase _currentViewModel;
        public ViewModelBase CurrentViewModel
        {
            get
            {
                return _currentViewModel;
            }
            set
            {
                if (_currentViewModel == value)
                    return;
                _currentViewModel = value;
                RaisePropertyChanged("CurrentViewModel");
            }
        }

我的app.xaml

<vm:ViewModelLocator x:Key="Locator"  d:IsDataSource="True" />

            <DataTemplate DataType="{x:Type vm:LoginViewModel}">
                <views:LoginView />
            </DataTemplate>

            <DataTemplate DataType="{x:Type vm:PainelDeOpcoesViewModel}">
                <views:PainelDeOpcoesView />
            </DataTemplate>

            <DataTemplate DataType="{x:Type vm:GerenciarUsuariosViewModel}">
                <views:GerenciarUsuariosView />
            </DataTemplate>

2 个答案:

答案 0 :(得分:0)

缺少一些位,但猜测是CurrentViewModel需要引发一个PropertyChanged通知(实现INotifyPropertyChanged):

public object CurrentViewModel {
    get { return _currentViewModel; }
    set {
        _currentViewModel = value;
        OnPropertyChanged("CurrentViewModel"); //Ensure you have this or are binding to a DependencyProperty
    }
}

如果没有解决问题,请提供您的财产的代码。

答案 1 :(得分:0)

您可以通过创建数据模板来获得所需的结果,其中 Viewmodel 充当查看作为其各自的值。 只需将上面的DataTemplate添加到您的xaml

即可
<Window.Resources>
<DataTemplate DataType="{x:Type DataTemplates:PainelDeOpcoesViewModel}">
    <DataTemplates:PainelDeOpcoesView></DataTemplates:PainelDeOpcoesView>
</DataTemplate>
<DataTemplate DataType="{x:Type DataTemplates:GerenciarUsuariosViewModel}">
    <DataTemplates:GerenciarUsuariosView></DataTemplates:GerenciarUsuariosView>
</DataTemplate>

点击按钮

CurrentViewModel = new PainelDeOpcoesViewModel();

                   OR

CurrentViewModel = new GerenciarUsuariosViewModel();