理论上,这段代码应该为我提供一个300x300的窗口,蓝色背景窗口的内容绑定到AstRootViewModel类型的对象,但似乎并非如此。我想知道这种情况正在发生,因为在我设置mainWindow.ViewModel属性之前,我没有调用astApplication.Run()。使用snoop检查绑定我有一个空白内容绑定,它被标记为错误,没有错误信息。
如果在调用应用程序Run方法之前不会发生属性通知,那么以MVVM友好的方式解决此问题的最佳方法是什么?
我有一个WPF应用程序的以下入口点:
[STAThread]
public static void Main()
{
settingsSource = LoadSettingsFile(".\\applicationSettings.xml");
astApplication = new Application();
mainWindow = new AstWindowView();
mainWindowModel = new AstRootViewModel();
dataModel = new AstDataModel(settingsSource);
mainWindow.ViewModel = mainWindowModel;
astApplication.MainWindow = mainWindow;
astApplication.Run();
}
AstWindowView类实现了以下重要代码:
public partial class AstWindowView : Window
{
public AstRootViewModel ViewModel
{
get { return (AstRootViewModel)GetValue(ViewModelProperty); }
set { SetValue(ViewModelProperty, value); }
}
// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModel", typeof(AstRootViewModel), typeof(Window), new UIPropertyMetadata(null));
public AstWindowView()
{
InitializeComponent();
}
}
以及以下重要的XAML
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="AstViewResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Content>
<Binding Path="ViewModel" Mode="Default" UpdateSourceTrigger="PropertyChanged"/>
</Window.Content>
AstViewResources.xaml文件定义了以下DataTemplate
<DataTemplate DataType="{x:Type vm:AstRootViewModel}">
<vw:AstRootView/>
</DataTemplate>
最后,AstRootView XAML包含以下重要的XAML:
<UserControl x:Class="SEL.MfgTestDev.AutomatedSettingsTransfer.View.AstRootView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Background="#FF000CFF"/>
</UserControl>
答案 0 :(得分:1)
看起来你没有在任何地方为AstWindowView设置DataContext,而你的Binding没有明确的Source设置。您是否在调试输出中看到绑定错误说明了这种情况?尝试在AstWindowView ctor中调用InitializeComponent之后添加(也可以通过更改XAML中的Binding来实现):
DataContext = this;