0

私はWPFで作業しており、一部のuserControlを作成しています。これらの一部は他の内部にあります。

userControlsの1つの背後にあるコードで、次のように依存関係プロパティを作成しました:(MyInnerControl.xaml.cs)

public static DependencyProperty MyDependencyProperty = DependencyProperty.Register(
        "MyProperty",
        typeof(Object),
        typeof(MyInnerControl));

public Object MyProperty
    {
        get
        {
            return (Object)GetValue(MyDependencyProperty );
        }
        set
        {
            SetValue(MyDependencyProperty , value);
        }
    }
...
...

そして、このプロパティは完全に機能しますが、次に、この依存関係を別のuserControlで次のように公開しようとします。

コンテナーuserControlの背後にあるコード:(MyContainerControl.xaml.cs)

    public static DependencyProperty MyExternalDependencyProperty = DependencyProperty.Register(
        "MyExternalProperty",
        typeof(Object),
        typeof(MyContainerControl));

public Object MyExternalProperty
    {
        get
        {
            return (Object)GetValue(MyExternalDependencyProperty );
        }
        set
        {
            SetValue(MyExternalDependencyProperty , value);
        }
    }
...
...

そして私のXAMLでは:(MyContainerControl.xaml)

<UserControl x:Class="MyControls.MyContainerControl" Name="this"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="329" d:DesignWidth="535" xmlns:my="clr-namespace:MyInnerControls">
<Grid>
    <my:MyInnerControl Margin="6,25,6,35" MyProperty="{Binding ElementName=this, Path=MyExternalProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
...
...

最後に、MyContainerControlをグリッドに追加し、以下のようにviewModelへのバインドを行います:(AnotherContainer.xaml)

...
<MyContainerControl MyExternalProperty="{Binding MyExternalProperty}"/>
...

私の問題は、ExternalPropertyが値を取得または設定しないことです。私は何が間違っているのですか?

明確にするために、私のDataContextは適切に設定されています。

誰かが私を助けてくれることを願っています、事前に感謝します。

4

2 に答える 2

1

この問題は、依存関係プロパティの命名規則に従っていないことが原因であると思われます。つまり、依存関係プロパティ名を<ProperyName>Property(たとえばMyExternalProperty)に設定し、同じ名前のCLRプロパティラッパーを使用しますが、 「プロパティ」サフィックス(この場合はMyExternal)。この規則に従うと、問題が解決するはずです。

MSDNから-依存関係プロパティの概要

プロパティとそのバッキングDependencyPropertyフィールドの命名規則は重要です。フィールドの名前は常にプロパティの名前であり、接尾辞Propertyが追加されます。この規則とその理由の詳細については、「カスタム依存関係のプロパティ」を参照してください。

編集:さらにいくつかのこと:

  1. 依存関係プロパティの登録が間違っています:代わりに、の代わりにパス"MyProperty""MyDependency""MyExternalProperty"います"MyExternalDependency"
  2. thisこれは予約済みのキーワードであるため、コントロールの名前として使用することは避けてください。
于 2012-06-19T19:56:57.317 に答える
0

UserControlにx:Nameを指定し、その値をElementNameに使用する必要があります

<UserControl x:Class="MyControls.MyContainerControl" Name="this"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     x:Name="ThisUserControl"
     d:DesignHeight="329" d:DesignWidth="535" xmlns:my="clr-namespace:MyInnerControls">
<Grid>
    <my:MyInnerControl Margin="6,25,6,35" MyProperty="{Binding ElementName=ThisUserControl, Path=MyExternalProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

.....。

于 2012-06-19T19:59:32.933 に答える