WPF - уведомление об изменении свойства от UserControl - PullRequest
1 голос
/ 01 сентября 2010

У меня есть два UserControls (uc1 и uc2), загружаемых в третий UserControl (оболочку).Оболочка имеет два свойства, uc1 и uc2, типа UserControl1 и UserControl2, и у каждого из них есть DependencyProperty, зарегистрированный для их собственных классов с именем IsDirty:

public static readonly DependencyProperty IsDirtyProperty = DependencyProperty.Register("IsDirty", typeof (bool), typeof (UserControl1));
public bool IsDirty
{
    get { return (bool) GetValue(IsDirtyProperty); }
    set { SetValue(IsDirtyProperty, value); }
}

(тот же код для UserControl2)

Shell имеет TextBlocks, привязанные к свойствам IsDirty:

<TextBlock Text="{Binding ElementName=shell, Path=Uc1.IsDirty}"/>
<TextBlock Text="{Binding ElementName=shell, Path=Uc2.IsDirty}"/>

Когда я изменяю значения IsDirty в uc1 и uc2, Shell никогда не получает уведомления.Что мне не хватает?UserControl является потомком DependencyObject ...

Такое же поведение возникает, если у меня есть обычные свойства, уведомляющие об изменениях через INotifyPropertyChanged.

Если я поднимаю перенаправленное событие из uc1 и uc2, всплывающее в Shell,тогда я могу поймать значение Dirty и все работает, но я не должен был этого делать, не так ли?

Спасибо

Редактировать: Ответ заключается в том, чтобы поднять событие измененного свойства в Uc1и Uc2 свойства или сделать их DP.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2010

Я попытался воспроизвести вашу проблему с помощью простой настройки, и она отлично работает для меня.Хотя я не уверен, что эта настройка достаточно правильная, чтобы повторить вашу ситуацию.Во всяком случае, я публикую это на всякий случай.Это может быть полезно:

XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication2"
        x:Name="shell"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Button Click="Button_Click">Click</Button>
        <TextBlock Text="{Binding ElementName=shell, Path=Uc1.IsDirty}"/>
    </StackPanel>
</Window>

Код сзади:

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MyUserControl uc1 = new MyUserControl();
        public MyUserControl Uc1
        {
            get { return this.uc1; }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.uc1.IsDirty = !this.uc1.IsDirty;
        }


    }

    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
        }

        public bool IsDirty
        {
            get { return (bool)GetValue(IsDirtyProperty); }
            set { SetValue(IsDirtyProperty, value); }
        }

        // Using a DependencyProperty as the backing store for IsDirty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsDirtyProperty =
            DependencyProperty.Register("IsDirty", typeof(bool), typeof(UserControl), new UIPropertyMetadata(false));

    }
}
1 голос
/ 01 сентября 2010

Ответ Karmicpuppet работает хорошо.Однако это не решило мою проблему, потому что Shell также имеет тип UserControl.Чтобы это работало, мне нужно было поднять свойство, измененное на Uc1 и Uc2.Когда я объявил их как DependencyProperties, все работало, как ожидалось.Duh!

...