2010-08-31 5 views
1

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

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, тогда я могу поймать грязное значение, и все работает, но я не должен этого делать, должен ли я?

Благодаря

Edit: Ответ заключается в повышении свойств измененного события на свойствах uc1 и UC2 или сделать их DPs.

+0

Ваш оператор привязки предполагает, что у Shell есть два свойства: «Uc1» и «Uc2». Это верно? Или «Uc1» и «Uc2» - только экземпляры UserControls, которые добавляются в XAML от Shell? – ASanch

+0

Да, это правильно. Shell имеет два свойства: uc1 и uc2 типов UserControl1 и UserControl2 соответственно. Я обновлю эту информацию. –

+0

Хорошо. Еще один вопрос: почему определение DependencyProperty выше названо «SecondDirtyProperty»? Правильно это или должно быть «IsDirtyProperty»? – ASanch

ответ

3

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

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> 

Code-Behind: ответ

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

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

Смежные вопросы