views:

4487

answers:

4

I have a user control where the XAML of the control can bind to the appropriate properties from the parent's data context like normal (the data context propagates in xaml).

For example, I have a window whose DataContext I am setting to ObjectA for example. My user control within the window is then try to access the properties within the dataContext

So my window's xaml and code behind can both see a non-null DataContext.

My control that DataContext propagates to can see a non-null DataContext in the Xaml but not in the code behind.

What is the proper way of handling this?

+2  A: 

I think you are checking the 'DataContext' in the constructor of the UserControl. It will be null at the Constructor since the user control hasnt yet created while execution is in the constructor code. But check the property at Loaded event you will see the object properly.

public partial class UserControl1
{
 public UserControl1()
 {
  this.InitializeComponent();

        //DataContext will be null here 
        this.Loaded += new RoutedEventHandler(UserControl1_Loaded);
 }

    void UserControl1_Loaded(object sender, RoutedEventArgs e)
    {
        //Check DataContext Property here - Value is not null
    }
}
Jobi Joy
noope. I am checking it within the context of the class.
Justin Bozonier
+2  A: 

failing that if you need to check whether the DataContext is being set you can use the DataContextChanged

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged);
    }

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        // You can also validate the data going into the DataContext using the event args
    }
}

Note it wont enter UserControl1_DataContextChanged until DataContext is changed from null to a different value.

Not sure if this answers your question but can be quite handy to use in debugging issues.

Bijington
+2  A: 

I would check to see whether you are having a binding error at runtime. Add this namespace to your XAML:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System"

and check the debugger's Output window for relevant error messages.

Alternatively, can you show us more code?

hughdbrown
Thank you... this is sweet... I wish I had found this weeks ago... lol.
Jason Stevenson
A: 

Thanks for your great and fast answer. I had tried in the meantime follows:


Inside my Usercontrol.xaml


<Button Tag="Schließen" Click="CloseEventClick">
  <StackPanel Orientation="Vertical">
                    <TextBlock Text="Schließen" FontSize="14" Style="{StaticResource ToolBarTextBlockStyle}" ToolTipService.ToolTip="Programm beenden" />
     </StackPanel>
</Button>

Code inside my Usercontrol.cs


// Deklarieren der Delegaten
public delegate void CloseEventHandler(object sender, EventArgs e);

// Events
public event CloseEventHandler NewEvent;

protected virtual void CloseEventClick(object sender, EventArgs e)
{
   if (CloseEvent != null)
       CloseEvent(this, new EventArgs());
}

Code inside my MainWindow.cs


myToolBar1.CloseEvent += new MyToolBar.CloseEventHandler(MyToolBar1CloseEvent);

void MyToolBar1CloseEvent(object sender, EventArgs e)
{
   if (FormModus.EditMode == 0 && FormModus.NewMode == 0)
   {
       Close();
   }
}

It works too. What is the better way, your sample or my sample?

Remark: It is a great forum, with very good and competent members!

Reinhard

Reinhard Müller