gpt4 book ai didi

mvvm - View 值未插入但从 ViewModel 中检索

转载 作者:行者123 更新时间:2023-12-03 10:45:29 25 4
gpt4 key购买 nike

我正在尝试基于 MVVM 模式的 WAF 框架创建应用程序。目前,我的解决方案包括两个项目(每个项目都配备了 MEF 和 MAF 引用):

  • *.Application(持有 Controller 和 View 模型)
  • *.Presentation(保存实际 View 文件)

  • 我正在通过 ViewModel 接口(interface)创建 View 和 View 模型之间的绑定(bind) - 请参阅下面的代码片段。此外,所有类都通过 App.xaml.cs 文件中的 MEF 框架提供。在这里, Controller 也被初始化。在最简单的情况下,我想在主窗口的标签中显示一个字符串值。

    问题是:如果我启动应用程序,第二个标签的值只显示回退值,但属性的 get 方法被正确调用(通过 Debug模式检查)。 View 和 ViewModel 之间的绑定(bind)似乎是正确的 - 如果我将 xaml 中的绑定(bind)路径更改为不存在的属性,我会得到在 ViewModel 中找不到该属性的输出。我的印象是 View 更新的事件可能有问题?对这种奇怪的行为有什么建议吗?

    这是 ViewModel 的专家:
    [Export]
    public class MainWindowViewModel : ViewModel<IMainWindowView>
    {
    private string _labelContent;
    public string LabelContent
    {
    get { return _labelContent; }
    set { SetProperty(ref _labelContent, value); }
    }

    [ImportingConstructor]
    public MainWindowViewModel(IMainWindowView view) : base(view)
    {
    }
    }

    这是 Controller 的摘录:
    [Export(typeof(IMainWindowController))]
    public class MainWindowController : IMainWindowController
    {
    private MainWindowViewModel _mainWindowViewModel;
    public MainWindowViewModel MainWindowViewModel
    {
    get { return _mainWindowViewModel; }
    set { _mainWindowViewModel = value; }
    }

    [ImportingConstructor]
    public MainWindowController(MainWindowViewModel mainWindowViewModel)
    {
    _mainWindowViewModel = mainWindowViewModel;
    }

    public void Initialize()
    {
    _mainWindowViewModel.LabelContent = "stfu";
    }
    }

    View 界面:
    public interface IMainWindowView : IView
    {
    }

    以及 View 本身:
    [Export(typeof(IMainWindowView))]
    public partial class MainWindow : Window, IMainWindowView
    {
    public MainWindow()
    {
    InitializeComponent();
    }
    }


    <Window x:Class="MyCompany.Product.Redesign.Presentation.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <StackPanel>
    <Label Content="Test" />
    <Label Name="MyLabel" Content="{Binding Path=LabelContent, FallbackValue=Fallback}" />
    </StackPanel>
    </Window>

    最佳答案

    您确定显示的 View 确实是您设置属性的 ViewModel-Instance 的实例吗?

    首先,确保您没有在 App.xaml 中将 View 设置为应用程序的 StartupUri-Property。然后确保通过 ViewModel 调用 View.Show()。然后,您可以确定您确实在正在显示的实例上设置了属性:

    应用程序.xaml

    <Application <!-- note: no StartupUri Property -->
    x:Name="App" x:Class="YourProject.Presentation.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ShutdownMode="OnMainWindowClose">
    </Application>

    MainViewController.cs(在 IMainViewController.cs 中有方法声明)
    public void Run()
    {
    _mainWindowViewModel.Show();
    }

    应用程序.xaml.cs
    _controller = mainExportProvider.GetExportedValue<IMainViewController>();
    _controller.Initialize();
    _controller.Run();

    MainViewModel.cs(在 IMainViewModel.cs 中有方法声明)
    public void Show()
    {
    ViewCore.Show();
    }

    这应该可以解决问题。否则,您可能会看到一个您没有引用的 View 实例。因此,您在未显示 View 的 ViewModel 上设置属性。

    关于mvvm - View 值未插入但从 ViewModel 中检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26753219/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com