2010-05-21 3 views
1

Я пытаюсь связать свойство «Содержимое» ярлыка с свойством из какого-либо специального типа, который у меня есть; к сожалению, я не понял, как это сделать, и именно поэтому я здесь :)Связать элемент управления WPF с свойством нестандартного типа

Предположим, что у меня есть следующий тип (может находиться в том же пространстве имен, что и в моем WPF-окне, которое содержит метку или другое пространство имен):

namespace MyNS 
{ 
    pubic class Person 
    { 
     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
     } 

     public void GetOlder 
     { 
      age++; 
     } 
    } 
} 

1) Как привязать ярлык к свойству «Возраст»?

2) Во время выполнения я создам экземпляр «Человек»; Я хочу убедиться, что мой ярлык привязан к правильному экземпляру; то есть, если бы я назвал:

Person SomePerson = new Person(); 
SomePerson.GetOlder(); 

Я хочу, чтобы мой Lable иметь новое значение свойства «Age» для «SomePerson».

3) Что делать, если я назвал «GetOlder» в другом потоке (с использованием потока Dispatcher или BackgroundWorker)? Смогу ли я получить последнюю ценность «Возраст»? Или мне нужно позаботиться о некоторых других вещах, чтобы сделать этот сценарий возможным?

Спасибо заранее,

TheBlueSky

ответ

1

Оказалось, что вид просто вещь, я задаюсь вопросом, почему никто не ответил :) Во всяком случае, вот ответы:

1) Во-первых, мы необходимо создать наш класс Person, как это:

using System.ComponentModel; 

namespace MyNS 
{ 
    pubic class Person : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
      set 
      { 
       age = value; 
       OnPropertyChanged("Age"); 
      } 
     } 

     protected void OnPropertyChanged(string PropertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(PropertyName)); 
      } 
     } 

     public void GetOlder 
     { 
      Age++; 
     } 
    } 
} 

2) Затем мы связываем наше управление WPF для person.age собственности, как это:

using System.Windows.Data; 

//... 

Person p = new Person(); 
Binding ageBinding = new Binding("Age"); 
ageBinding.Source = p; 
MyWpfLabelControl.SetBinding(Label.ContentProperty, ageBinding); 

Теперь, когда p.GetOlder() называется MyWpfLabelControl.Content будет изменен на новое значение p.Age.

3) В многопоточном режиме история не отличается; он будет работать одинаково при вызове p.GetOlder() в другом потоке:

new Thread(
    new ThreadStart(
     delegate() { 
      p.GetOlder(); 
     } 
)).Start(); 

Надеюсь, это поможет.

TheBlueSky

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