应用程序启动前的WPF绑定设置不通知?

时间:2010-02-19 20:29:59

标签: wpf data-binding mvvm

理论上,这段代码应该为我提供一个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>

1 个答案:

答案 0 :(得分:1)

看起来你没有在任何地方为AstWindowView设置DataContext,而你的Binding没有明确的Source设置。您是否在调试输出中看到绑定错误说明了这种情况?尝试在AstWindowView ctor中调用InitializeComponent之后添加(也可以通过更改XAML中的Binding来实现):

DataContext = this;