我在类中有以下依赖属性:
class FooHolder
{
public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
"CurrentFoo",
typeof(Foo),
typeof(FooHandler),
new PropertyMetadata(OnCurrentFooChanged));
private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
FooHolder holder = (FooHolder) d.Property.Owner; // <- something like this
// do stuff with holder
}
}
Run Code Online (Sandbox Code Playgroud)
我需要能够检索对更改的属性所属的类实例的引用.
这是因为FooHolder有一些事件处理程序需要在属性值更改时挂钩/取消挂钩.属性更改回调必须是静态的,但事件处理程序不是.
我有一个数据绑定设置与转换器,以将一个笨拙的XML源转换为显示和编辑方便的内部类树.一切都非常适合从XML源读取,但我有一段时间试图对内部类进行更改以传播回XML源.
这是使用网站的XAML:
<local:SampleConverter x:Key="SampleConverter" />
<Expander Header="Sample" >
<local:SampleControl
Sample="{Binding Path=XmlSource,
Converter={StaticResource SampleConverter},
Mode=TwoWay}" />
</Expander>
Run Code Online (Sandbox Code Playgroud)
XmlSource是父数据绑定对象的CLR读写属性(不是DependencyProperty).它是从XSD生成的.NET类型.
SampleConverter实现IValueConverter.Convert调用该方法并返回非空数据,但从ConvertBack不调用该方法.
SampleControl是一个UserControl,它封装了与Sample数据树的UI交互.这是XAML看起来像这样:
<UserControl x:Class="SampleControl">
[... other stuff ...]
<UserControl.Content>
<Binding Path="Sample" RelativeSource="{RelativeSource Mode=Self}" Mode="TwoWay" TargetNullValue="{StaticResource EmptySampleText}" />
</UserControl.Content>
<UserControl.ContentTemplateSelector>
<local:BoxedItemTemplateSelector />
</UserControl.ContentTemplateSelector>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
Sample属性是SampleControl代码中的DependencyProperty:
public static readonly DependencyProperty SampleProperty =
DependencyProperty.Register("Sample", typeof(SampleType), typeof(SampleControl), new PropertyMetadata(new PropertyChangedCallback(OnSampleChanged)));
public SampleType Sample
{
get { return (SampleType)GetValue(SampleProperty); }
set { SetValue(SampleProperty, value); }
}
private static void OnSampleChanged(DependencyObject d, DependencyPropertyChangedEventArgs …Run Code Online (Sandbox Code Playgroud)