我正在尝试在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>
答案 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上设置属性,而该视图未显示。