views:

84

answers:

1

I have two UserControls that I want to display in a Window. The value of the property "SelectedItem" of the first UserControl should be set to the second UserControl's "SelectedItem" property. How do I do this?

In my current code, the value set in the first UserControl's property does not trigger an update in the second UserControl. I have attached models for respective usercontrol/window.

The following is the code in the Window;

<MyControls:MyFirstUserControl x:Name="m_controlOne" />
<MyControls:MySecondUserControl x:Name="m_controlTwo" SelectedItem={Binding Path=SelectedItem, ElementName="m_controlOne" />

I have also attempted to add UpdateSourceTrigger=PropertyChanged in the Binding structure above, but to no avail.

In MyFirstUserControl, I have implemented a DependencyProperty that is linked to a property called "SelectedItem" and likewise in MySecondUserControl. I have also attempted to implement INotifyPropertyChanged in both UserControls (the models have them implemented as well).

In MyFirstUserControl's property's set { }, I have attempted to use OnPropertyChanged("SelectedItem"), OnPropertyChanged(new DepedencyPropertyChangedEventArgs(...)) as well as SetValue(SelectedItemProperty), all failing to trigger an update in the SelectedItem property for the second user control.

What have I missed to do?

+1  A: 

A couple of things are wrong here.

If you're using Dependency Properties you don't need to implement INotifyPropertyChanged.

Also, WPF doesn't use the setter of a Dependency Property, but instead sets the backing field directly. This is why setting a breakpoint in the setter doesn't work.

If you want to execute code when WPF sets the property, there's an overload of the Register method that allows you to specify a handler that runs every time the property is set.

public static readonly DependencyProperty SelectedItemProperty =
    DependencyProperty.Register(
        "SelectedItem", typeof(object), typeof(MySecondUserControl),
        new PropertyMetadata(SelectedItemChanged));

private static void SelectedItemChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MySecondUserControl instance = (MySecondUserControl)d;
    instance.OnSelectedItemChanged(e);
}

protected virtual void OnSelectedItemChanged(
    DependencyPropertyChangedEventArgs e)
{
    // Do code triggered by change here
}

Lastly, the binding syntax isn't correct (typo?). You're missing a } and your quotes are in the wrong spot. It should be:

<MyControls:MySecondUserControl 
    x:Name="m_controlTwo" 
    SelectedItem="{Binding Path=SelectedItem, ElementName=m_controlOne}" 
/>
Cameron MacFarland