当我更改绑定页面属性时,为什么我的wpf主窗口没有更新?

时间:2018-01-12 04:11:45

标签: c# wpf mvvm

在我的MainWindow.xaml中,我有:

<Frame Grid.Row="1" Content="{Binding MainWindowModelData.ContentView}"/>

在我的MainWindowModelData中,我有一个名为ContentView的属性:

private Page _ContentView;
public Page ContentView
{
    get
    {
        if (_ContentView == null)
        {
            LicenceManagerModel pModel = new LicenceManagerModel();
            LicenceManagerViewModel pViewModel = new LicenceManagerViewModel(pModel);
            LicenceManagerView pView = new LicenceManagerView();
            pView.DataContext = pViewModel;

           _ContentView = pView;
        }
        return _ContentView;
        //return _ContentView ?? (_ContentView = new Page());
    }
    set
    {
        Set(ref _ContentView, value);
    }
}

到目前为止,LicenceManagerView正在构建文本。 设置(ref _ContentView,value);将提升物业交易活动

当程序启动时,ContentView被设置并且“正在构建”(它显然有一个对LicenceManagerView的引用。

在MainWindowModel中,我有一些代码来更改此ContentView属性:

MenuModel pModel = new MenuModel();
MenuViewModel pViewModel = new MenuViewModel(pModel);
MenuView pView = new MenuView();
pView.DataContext = pViewModel;

ContentView = pView;

引发并更改ContentView属性。

问题:ContentView现在指向MenuView,但主窗口继续显示LicenceManagerView中的“Under Construction”。

发生了什么事?

1 个答案:

答案 0 :(得分:0)

我通过实施以下方法解决了这个问题: 1:MainWindow将加载一个MenuView 2:MenuView顶部有按钮,下面有主要内容。 3. MenuView模型有一个属性ContentView(带有propertyChange事件) 4.单击其他菜单按钮时,ContentView将设置为不同的view-viewmodel-model

注意:所有代码都是代码,而不是整个代码。

<强>主窗口:

<DockPanel>
    <Frame x:Name="MainWindowFrame" NavigationUIVisibility="Hidden"/>
</DockPanel>

MainWindow背后的代码

    private void PageLoaded(object sender, RoutedEventArgs e)
    {
        MenuModel pModel = new MenuModel();
        MenuViewModel pViewModel = new MenuViewModel(pModel);
        MenuView pView = new MenuView();
        pView.DataContext = pViewModel;
        MainWindowFrame.Content = pView;
    }

MenuView具有:

<Frame Content="{Binding MenuModelData.ContentView}"/>

MenuModel具有:

    private Page _ContentView;
    public Page ContentView
    {
        get
        {
            if (_ContentView == null) { _ContentView = ViewLicenceManager; }
            return _ContentView;
        }
        set
        {
            Set(ref _ContentView, value);
        }
    }

<强> MenuViewModel

    internal sealed class MenuViewModel
    {
       public MenuViewModel()
       {

       }

       public MenuViewModel(MenuModel wModel)
       {
           if (wModel == null) { return; }
           MenuModelData = wModel;
       }

       private MenuModel _MenuModelData;
       public MenuModel MenuModelData
       {
           get
           {
               if (_MenuModelData == null) { _MenuModelData = new MenuModel(); }
               return _MenuModelData;
           }
           set
           {
               MenuModelData = value;
           }
       }

   }