#silverlight
#silverlight
Вопрос:
Недавно я разрабатывал пользовательский элемент управления в Silverlight, я создал пользовательское свойство зависимости, которое имеет тип ObservableCollection. У меня есть еще 2 пользовательских свойства зависимостей типа strings. Мое требование заключается в добавлении любого элемента в коллекцию, я должен запустить событие CollectionChanged , в этом обработчике событий я хочу обновить другие 2 свойства зависимостей.
public static readonly DependencyProperty itemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<ValidationErrorMessage>), typeof(SummaryUserControl), new PropertyMetadata(new ObservableCollection<ValidationErrorMessage>(), new PropertyChangedCallback(fun1)));
public ObservableCollection<ValidationErrorMessage> Items
{
get
{
return (ObservableCollection<ValidationErrorMessage>)base.GetValue(itemsProperty);
}
set
{
base.SetValue(itemsProperty, value);
}
}
public static void fun1(object sender, DependencyPropertyChangedEventArgs evt)
{
var newValue = evt.NewValue as ObservableCollection<ValidationErrorMessage>;
if(newValue!=null)
newValue.CollectionChanged = new NotifyCollectionChangedEventHandler(CollectionChangedHandler);
var oldValue = evt.OldValue as ObservableCollection<ValidationErrorMessage>;
if(oldValue!=null)
oldValue.CollectionChanged -= new NotifyCollectionChangedEventHandler(CollectionChangedHandler);
}
static void CollectionChangedHandler(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
var newItems = e.NewItems as ObservableCollection<ValidationErrorMessage>;
foreach (var item in newItems)
{
item.PropertyChanged = new PropertyChangedEventHandler(item_PropertyChanged);
}
}
}
static void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
}
public static readonly DependencyProperty headerProperty = DependencyProperty.Register("Header", typeof(String), typeof(SummaryUserControl), new PropertyMetadata(String.Empty, null));
public String Header
{
get
{
return (String)base.GetValue(headerProperty);
}
set
{
base.SetValue(headerProperty, value);
RaisePropertyChange("Header");
}
}
public static readonly DependencyProperty messageTypeProperty =
DependencyProperty.Register("MessageType", typeof(MessageEnumType), typeof(SummaryUserControl), new PropertyMetadata(MessageEnumType.Error, null));
public MessageEnumType MessageType
{
get { return (MessageEnumType)GetValue(messageTypeProperty); }
set { SetValue(messageTypeProperty, value); RaisePropertyChange("MessageType"); }
}
Как я могу изменить значения свойств зависимостей MessageType и Header? Я не могу получить доступ к этим свойствам ни в CollectionChanged
NotifyPropertyChanged
событии или, поскольку все эти события являются статическими. Я не могу получить доступ к экземпляру в этих статических обработчиках событий.
Я пытался решить проблему с помощью конвертера, но из-за моего недостатка в Silverlight мне хочется использовать описанный выше подход. Как я могу установить значения для этих свойств зависимостей в CollectionChanged
событии или NotifyPropertyChanged
событиях?
Ответ №1:
Отправителем в вашем статическом методе fun1 должен быть экземпляр класса, который объявляет свойство itemsProperty DependencyProperty . Поэтому вы можете получить доступ к конкретному экземпляру, приведя отправителя к вашему классу.
public static void fun1(object sender, DependencyPropertyChangedEventArgs evt)
{
MyClass concreteInstance = sender as MyClass;
if(concreateInstance != null)
{
[...your code...]
}
}