0

文字列型のカスタム依存関係プロパティを持つカスタムユーザーコントロールがあります。次のように、周囲のアプリにあるテキストボックスに双方向でバインドする必要があります。

<Textbox Name="TextBoxInHostApp"/>
<ctrl:MyControl 
     ....
         MyString = "{Binding ElementName=TextBoxInHostApp, Path=Text, Mode=TwoWay}"
</ctrl:MyControl>

問題:

コントロールには、依存関係プロパティの値も表示する機能が必要です。

MyControlには、単純な文字列プロパティ「Name」があります。これにより、MyStringの依存プロパティ値が更新されます。

したがって、通常、MyStringが外部にバインドされていない場合は、コントロールが使用されるxamlでコーディングします。

<Textbox Name="TextBoxInHostApp"/>
<ctrl:MyControl 
     ....
         MyString = "{Binding Name}"
</ctrl:MyControl>

しかし、私の場合、それは利用できません。

試行1:usercontrolxaml内でトリガーを使用しました。

<UserControl.Style>
    <Style>
        <Style.Setters>
            <Setter Property="local:MyControl.MyString" Value="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
        </Style.Setters>
    </Style>

dpの「ローカル値」がすでにここで設定されているため、このトリガーは機能しません。

MyString = "{Binding ...

コメントアウトした場合:

<!--<MyString = "{Binding ...

...「ローカル値」が設定されていないため、トリガーは正常に機能します。

次の試み:MyControlsビューモデルでハードな方法とコードを試してみます:

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
         RaisePropertyChanged("Name");

         MyOwningUICtrl.SetValue(MyControl.MyStringProperty, value); // ??
    }
}

SetValueを呼び出すためにDependencyObjectを渡す必要がありますが、これはMVVMにとって不快です。このシナリオにはもっと良い解決策があるはずですか?

4

2 に答える 2

3

これは仕様によるものです

WPFの依存関係プロパティの優先順位リストによると、a内でローカルに指定された値は、aまたはa<Tag>で指定された値よりも常に優先されます。StyleTrigger

一般的な問題は、に値を設定してから、に値<Tag>を変更しようとすることStyle.Triggerです。解決策は、デフォルト値を<Setter>では<Style>なく、に設定することです<Tag>。これにより、トリガーされた値がスタイル設定された値よりも優先されます。

<Style>
    <!-- Default Value
    <Setter Property="local:MyControl.MyString" 
            Value="{Binding ElementName=TextBoxInHostApp, Path=Text, Mode=TwoWay}"/>

    <Style.Triggers>
        <Trigger ...>
            <!-- Triggered Value -->
            <Setter Property="local:MyControl.MyString" 
                    Value="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
        </Trigger>
    </Style.Setters>
</Style>

しかし、実際にはどこにもトリガーが定義されていないので、これがあなたの問題であるかどうかはわかりません。

コードの正確な構造については少しわかりませんが、依存関係プロパティは別の値へのポインタのようなものであることに注意してください。を指すように設定することも、を指すように設定することもできますがTextBox.TextDataContext.Name両方を設定することはできません。

両方を設定しTextBox.TextMyUserControl.MyStringを指すようにする場合は、 Natxoが提案するようDataContext.Nameに両方のプロパティをバインドする必要があります。"{Binding Name}"

または、タグで指定されていない場合にバインドしようとしMyStringている場合は、 PriorityBindingここでの例)を使用するか、プロパティを外部に公開して、外部要素が次のようなコントロールを使用できるようにすることができます。UserControl.NameMyString<ctrl:MyControl ...>Name<ctrl:MyControl Name="{Binding ...}" />

于 2013-03-25T14:40:42.643 に答える
1

TextboxとMycontrolの両方に同じ値を表示する場合...なぜそれらをそのプロパティにバインドしないのですか?:

<Textbox Name="TextBoxInHostApp" Text="{Binding Name}"/>
<ctrl:MyControl 
     ....
         MyString="{Binding Name}"
</ctrl:MyControl>
于 2013-03-25T14:21:54.210 に答える