未插入视图值,但从ViewModel检索

时间:2014-11-05 09:09:18

标签: mvvm data-binding waf-framework-c#

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

  • *。应用程序(持有控制器和视图模型)
  • *。演示文稿(保存实际视图文件)

我通过ViewModel接口在view和viewmodel之间创建绑定 - 请参阅下面的代码片段。此外,所有类都可以通过 App.xaml.cs 文件中的MEF框架获得。这里,控制器也被初始化。在最简单的情况下,我想在主窗口的标签中显示一个字符串值。

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

以下是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)
    {
    }
}

这是控制器的exerpt:

[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";
    }
}

视图界面:

public interface IMainWindowView : IView
{
}

观点本身:

[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>

1 个答案:

答案 0 :(得分:0)

您确定,显示的视图确实是您正在设置属性的ViewModel-Instance的实例吗?

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

的App.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();
}

App.xaml.cs

_controller = mainExportProvider.GetExportedValue<IMainViewController>();
_controller.Initialize();
_controller.Run();

MainViewModel.cs(在IMainViewModel.cs中使用方法声明)

public void Show()
{
    ViewCore.Show();
}

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