Property binding across controls in WPF
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 S开发者_Go百科etValue(SelectedItemProperty)
, all failing to trigger an update in the SelectedItem property for the second user control.
What have I missed to do?
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}"
/>
精彩评论