У меня есть пользовательский элемент Silverlight с двумя свойствами; Текст и идентификатор. Я создал DependencyProperties для них в соответствии с приведенным ниже кодом.
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(LookupControl), new PropertyMetadata(NotifyPropertyChanged));
public static readonly DependencyProperty IdProperty = DependencyProperty.Register("Id", typeof(Guid?), typeof(LookupControl), new PropertyMetadata(NotifyPropertyChanged));
public event PropertyChangedEventHandler PropertyChanged;
public static void NotifyPropertyChanged(object sender, DependencyPropertyChangedEventArgs args)
{
var control = sender as LookupControl;
if (control != null && control.PropertyChanged != null)
{
control.PropertyChanged(control, new PropertyChangedEventArgs("Text"));
}
}
public Guid? Id
{
get { return (Guid?)GetValue(IdProperty); }
set { SetValue(IdProperty, value); }
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
В методе управления сначала заполняется идентификатор, а затем текст. Моя проблема заключается в том, что когда я привязываюсь к Text и Id на этом элементе управления, я хочу, чтобы их данные были заполнены синхронно, так что когда событие PropertyChanged срабатывает по любому свойству, у обоих из них есть обновленные данные.
В этот момент я поймаю, когда Идентификатор изменился, выполнил некоторую обработку, и, если необходимо, я установил текст в новое значение. Но как только этот OnChange Id завершился, метод управления продолжается и заполняет текст после того, как я уже изменил его на другое.
Холодно, вы сохраняете значения и устанавливаете только, когда у вас есть оба?
private Guid? id;
private string text;
public Guid?Id
{
get { return id; }
set {
id = value;
TrySetValue();
}
}
public string Text
{
get { return text; }
set { text = value;
TrySetValue()}
}
private void TrySetValue()
{
if (id != null && text != null)
{
SetValue(IdProperty, id);
SetValue(TextProperty, text);
}
}