0

コンテンツに基づいてさまざまな「エディター」(他のユーザーコントロール)を表示するEditorViewというUserControlがあります。

これは、FontEditorをTextBlockに置き換えたバインディングをテストするためのEditorViewです。

<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を使用しているので、何か特別なことはありますか?たぶん、異なる名前空間であることが問題ですか?

4

1 に答える 1

1

ユーザーコントロールはそれに影響を与えるべきではありません。違いは、( TextBlockで既存のTextを使用するのではなく)独自の依存関係プロパティを実装していることです。DependencyPropertyPropertyChangedハンドラーで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;
    })
);
于 2012-09-08T02:07:39.210 に答える