English 中文(简体)
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 SetValue(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}" 
/>




相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签