Мой вопрос касается Silverlight (но, думаю, и WPF тоже).
В основном я знаю, как создать свойство зависимости в пользовательском элементе управления и как заставить его работать. Но то, что я пытался сделать, но не получилось: создать свойство зависимости (или более одного) в классе, и этот класс станет свойством зависимости для моего пользовательского элемента управления.
Другими словами:
// my UserControl
public class DPTest : UserControl
{
// dependency property, which type is a class, and this class will be holding other dependency properties
public static readonly DependencyProperty GroupProperty =
DependencyProperty.Register("Group", typeof(DPGroup), typeof(DPTest), new PropertyMetadata(new DPGroup(), OnPropertyChanged));
public DPGroup Group
{
get { return (DPGroup)GetValue(GroupProperty); }
set { SetValue(GroupProperty, value); }
}
// this occurs only when property Group will change, but not when a member of property Group will change
static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DPTest g = d as DPTest;
// etc.
}
}
// a class, where I want to hold my dependency properties
public class DPGroup : DependencyObject
{
public static readonly DependencyProperty MyProperty1Property =
DependencyProperty.RegisterAttached("MyProperty1", typeof(int), typeof(DPGroup), new PropertyMetadata(1, OnPropertyChanged));
public int MyProperty1
{
get { return (int)GetValue(MyProperty1Property); }
set { SetValue(MyProperty1Property, value); }
}
// I would like to notify "the parent" (which means user control "DPTest" ), that member MyProperty1 has changed
static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DPTest g = d as DPTest;
if (g != null) g.textBox1.Text = g.Group.MyProperty1.ToString();
}
}
То, чего я хочу добиться, - это , чтобы уведомить (во время разработки в XAML) пользовательский элемент управления DPTest
, что член свойства Group
(Group.MyProperty1
) изменил свое значение . Мне удалось сделать это во время выполнения, например, с помощью обработчика событий, определенного в DPGroup
классе, но это не работает во время разработки в xaml.
<Grid x:Name="LayoutRoot" Background="White">
<local:DPTest>
<local:DPTest.Group>
<local:DPGroup MyProperty1="2"/>
</local:DPTest.Group>
</local:DPTest>
</Grid>
Работает, но только в первый раз, при создании тега:
<local:DPGroup MyProperty1="2"/>
и после этого при изменении значения MyProperty1
не срабатывает DPTest.OnPropertyChange
. Вероятно, срабатывает DBGroup.OnPropertyChanged
, но это, конечно, не уведомляет пользовательский элемент управления DPTest
об этом. Так как же заставить DPTest
знать, что Group.MyProperty1
изменился?
Я не хочу делать привязки из MyProperty1
к соответствующему свойству, созданному внутри пользовательского элемента управления DPTest
(не дублировать свойства), смысл в том, чтобы иметь группу свойств в отдельном классе, поэтому я могу использовать эта группа более одного раза, например:
// my UserControl
public class DPTest : UserControl
{
public DPGroup Group1 { ... }
public DPGroup Group2 { ... }
}
Я вижу некоторую аналогию с UIElement.RenderTransform
(скажем, это мое свойство Group
), которая содержит, например, ScaleTransform
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RenderTransform>
<ScaleTransform ScaleX="0.4"/>
</Grid.RenderTransform>
</Grid>
ScaleX
является аналогом MyProperty1
. Разница в том, что изменение значения ScaleX
(в XAML) будет отражать немедленные изменения во время разработки, и именно этого я и пытаюсь достичь.
Я пытался найти решение во всем переполнении Google / стека и других, но ничего не нашел. Везде только примеры создания свойств зависимостей внутри пользовательского элемента управления.
Спасибо за ваше время.
Любая помощь высоко ценится.
edit: на основании ответа Харлоу Берджесса удалось создать рабочий пример в Silverlight. Я положил все решение ниже в качестве отдельного ответа.