我有一个名为EditorView的UserControl,根据其内容显示不同的“编辑器”(其他用户控件)。
这是EditorView,只是为了测试我用TextBlock替换FontEditor的绑定:
<UserControl x:Class="TrikeEditor.UserInterface.EditorView" ...>
<UserControl.Resources>
<DataTemplate DataType="{x:Type te_texture:Texture}">
<teuied:TextureEditor TextureName="{Binding Path=Name}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type te_font:Font}">
<!--<teuied:FontEditor/>-->
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</UserControl.Resources>
<UserControl.Template>
<ControlTemplate TargetType="{x:Type UserControl}">
<ContentPresenter Content="{TemplateBinding Content}" x:Name="EditorPresenter"/>
</ControlTemplate>
</UserControl.Template>
</UserControl>
根据EditorView.Content选择正确的模板,在TextBlock的情况下,绑定按照需要工作,但在TextureEditor的情况下,TextureName属性不是。
以下是TextureEditor的片段:
public partial class TextureEditor : UserControl
{
public static readonly DependencyProperty TextureNameProperty = DependencyProperty.Register("TextureName", typeof(string), typeof(TextureEditor));
public string TextureName
{
get { return (string)GetValue(TextureNameProperty); }
set { SetValue(TextureNameProperty, value); }
}
public TextureEditor()
{
InitializeComponent();
}
}
自从我使用UserControl以来,我有什么特别的事吗?也许是不同的命名空间是问题?
答案 0 :(得分:1)
用户控制不应该影响它;区别在于您正在实现自己的依赖项属性(而不是使用 TextBlock 中现有的 Text )。您必须在依赖项属性 PropertyChanged 处理程序中设置 TextureName 属性的值:
public static readonly DependencyProperty TextureNameProperty =
DependencyProperty.Register("TextureName", typeof(string), typeof(TextureEditor),
// on property changed delegate: (DependencyObject, DependencyPropertyChangedEventArgs)
new PropertyMetadata((obj, args) => {
// update the target property using the new value
(obj as TextureEditor).TextureName = args.NewValue as string;
})
);