c# - 当我更改绑定(bind)页面属性时,为什么我在 wpf 中的主窗口没有更新?

标签 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 的文本正在构建中。
设置(引用 _ContentView,值);将引发属性(property)变更事件

当程序启动时,设置 ContentView 并显示“正在 build 中”(它显然有对 LicenceManagerView 的引用。

在 MainWindowModel 我有一些代码来更改此 ContentView 属性:
MenuModel pModel = new MenuModel();
MenuViewModel pViewModel = new MenuViewModel(pModel);
MenuView pView = new MenuView();
pView.DataContext = pViewModel;

ContentView = pView;

ContentView 属性被提升和更改。

问题:ContentView 现在指向一个 MenuView,但主窗口一直显示来自 LicenseManagerView 的“正在 build 中”。

到底是怎么回事?

最佳答案

我通过实现以下解决了这个问题:
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;
           }
       }

   }

关于c# - 当我更改绑定(bind)页面属性时,为什么我在 wpf 中的主窗口没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219433/

相关文章:

c# - 检测调试器是否已连接*并*单步执行

c# - 为什么调用这个重写的方法?

c# - 使用 iTextSharp C# 更改 PDF 注释属性

c# - 数据绑定(bind) ViewModel 的问题

wpf - 一个模型实体,多个页面 -> 多个 View ?多个 View 模型?

c# - 字典 - 文本框绑定(bind)不起作用

c# - .net 环境中是否使用了 monad?

c# - WPF 用户控制资源

c# - 带有固定标题的 ComboBox

c# - 在 DataGrid 中看不到文本框文本