Связывание WPF, установленное до запуска приложения, не уведомляет? - PullRequest
0 голосов
/ 19 февраля 2010

Теоретически этот код должен предоставить мне окно размером 300x300 с синим фоном от привязки содержимого окна к объекту типа AstRootViewModel, однако, похоже, это не так. Мне интересно, что это происходит, потому что я не вызываю astApplication.Run () до тех пор, пока я не установлю свойство mainWindow.ViewModel. Используя 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 DataType="{x:Type vm:AstRootViewModel}">
    <vw:AstRootView/>
</DataTemplate>

И, наконец, XAML AstRootView содержит следующий значимый 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 Ответ

1 голос
/ 20 февраля 2010

Похоже, вы нигде не устанавливаете DataContext для AstWindowView, и у вашего Binding нет явного набора Source. Вы видите ошибку привязки, говорящую что-то об этом в выходных данных отладки? Попробуйте добавить после вызова InitializeComponent в AstWindowView ctor (это также можно сделать, изменив Binding в XAML):

DataContext = this;
...