在ContentPresenter中将XAML绑定到UserControl的属性

时间:2012-09-08 01:56:18

标签: wpf xaml user-controls datatemplate contentpresenter

我有一个名为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以来,我有什么特别的事吗?也许是不同的命名空间是问题?

1 个答案:

答案 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;
    })
);