views:

33

answers:

1

In theory this code should provide me with a 300x300 window with a blue background from having the window's content bound to an object of type AstRootViewModel, however this doesn't seem to be the case. I'm wondering it this is happening because I don't call astApplication.Run() until after I set the mainWindow.ViewModel property. Using snoop to check the binding I have a blank content binding and it's flagged as an error with no error information.

If it is the case that property notification does not occurr until the application Run method is called, then what would be the best way to resolve this in an MVVM friendly way?

I have the following Entry point to a WPF application:

    [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();
    }

The AstWindowView class implements the following significant code behind:

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

and the following significant 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>

The AstViewResources.xaml file defines the following DataTemplate

<DataTemplate DataType="{x:Type vm:AstRootViewModel}">
    <vw:AstRootView/>
</DataTemplate>

And lastly, the AstRootView XAML contains the following significant 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  A: 

It looks like you're not setting the DataContext for AstWindowView anywhere and your Binding has no explicit Source set. Are you seeing a binding error saying something to that effect in your debug output? Try adding after the InitializeComponent call in AstWindowView ctor (could also do it by changing the Binding in XAML):

DataContext = this;
John Bowen
@commits newbiemistakesuicide
Firoso
better solution:DataContext="{Binding RelativeSource={RelativeSource Self}}"
Firoso