2013-10-13 4 views
0

Я создаю простой User Control с тремя свойствами. Для простоты предположим, что это A, B и C. Кроме того, C = A + B. Я хочу отобразить их все в TextBoxes (A, B - Редактируемый пользователем, C - только для чтения). Всякий раз, когда пользователь изменяет A или B, значение C должно обновляться.Добавление логики в пользовательский элемент управления в WPF

Я уже создал свойства зависимостей для A и B в файле MyControl.xaml.cs.

public static readonly DependencyProperty AProperty = 
      DependencyProperty.Register("A", typeof(double), 
      typeof(MyControl), new FrameworkPropertyMetadata(0.0)); 

    public double A 
    { 
     get { return (double)GetValue(AProperty); } 
     set { SetValue(AProperty, value); } 
    } 

    public static readonly DependencyProperty BProperty = 
      DependencyProperty.Register("B", typeof(double), 
      typeof(MyControl), new FrameworkPropertyMetadata(0.0)); 

    public double B 
    { 
     get { return (double)GetValue(BProperty); } 
     set { SetValue(BProperty, value); } 
    } 

Мой вопрос: что мне делать с C и где его определение должно быть сохранено? Должна ли логика быть закодирована внутри элемента управления или, может быть, пользователь обязан помнить о взаимосвязи между свойствами?

ответ

2

Вы должны объявить еще DependencyProperty для C в UserControl и добавить обработчики изменения свойств ваших A и B свойств для обновления значения C при изменении их значения. Это должно сделать работу:

public static readonly DependencyProperty AProperty = 
    DependencyProperty.Register("A", typeof(double), 
    typeof(MyControl), new UIPropertyMetadata(0.0, OnAOrBPropertyChanged)); 

public static readonly DependencyProperty BProperty = 
    DependencyProperty.Register("B", typeof(double), 
    typeof(MyControl), new UIPropertyMetadata(0.0, OnAOrBPropertyChanged)); 

public static void OnAOrBPropertyChanged(DependencyObject dependencyObject, 
    DependencyPropertyChangedEventArgs e) 
{ 
    dependencyObject.SetValue(CProperty, (double)dependencyObject.GetValue(AProperty) + 
     (double)dependencyObject.GetValue(BProperty)); 
} 

вы хотели бы просмотреть Read-Only Dependency Properties страницу на MSDN для помощи при объявлении только для чтения DependencyProperty.

+0

Спасибо! Это именно то, что я искал. –

1

Вам нужно сделать еще одно свойство зависимостей для C также

Вы можете попробовать это:

public static readonly DependencyProperty AProperty = 
      DependencyProperty.Register("A", typeof(double), 
      typeof(MyControl), new FrameworkPropertyMetadata(OnAorBChange)); 

     public double A 
     { 
      get { return (double)GetValue(AProperty); } 
      set { SetValue(AProperty, value); } 
     } 

     public static readonly DependencyProperty BProperty = 
       DependencyProperty.Register("B", typeof(double), 
       typeof(MyControl), new FrameworkPropertyMetadata(OnAorBChange)); 

     public double B 
     { 
      get { return (double)GetValue(BProperty); } 
      set { SetValue(BProperty, value); } 
     } 

     public static readonly DependencyProperty CProperty = 
      DependencyProperty.Register("C", typeof(double), 
      typeof(MyControl), new FrameworkPropertyMetadata(null)); 

     public double C 
     { 
      get { return (double)GetValue(CProperty); } 
      set { SetValue(CProperty, value); } 
     } 

     private static void OnAorBChange(DependencyObject obj, 
      DependencyPropertyChangedEventArgs args) 
     { 
      var obj1 = obj as MyControl; 
      obj1.C = obj1.A + obj1.B; 
     } 

Я предполагаю, что вы сделали правильный связывающую :)

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