0

ColorPicker(WPF 拡張ツールキットから) とその 16 進コードのテキスト フィールドを表示する非常に単純なユーザー コントロールを作成しました。

<UserControl x:Class="HexColorPicker"> <!-- namespace declarations omitted -->
    <UserControl.Resources>
        <glue:ColorToRgbHex x:Key="colorToHex"/> <!-- custom converter I made -->
    </UserControl.Resources>
    <StackPanel Orientation="Horizontal" Name="layoutRoot">
        <Label Content="#"/>
        <TextBox Text="{Binding SelectedColor, Converter={StaticResource colorToHex}}"/>
        <extToolkit:ColorPicker SelectedColor="{Binding SelectedColor}"/>
    </StackPanel>
</UserControl>

そして、ここにバッキングコードがあります:

public partial class HexColorPicker : UserControl
{
    public static readonly DependencyProperty SelectedColorProperty
        = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(HexColorPicker));

    public HexColorPicker()
    {
        InitializeComponent();
        layoutRoot.DataContext = this;
    }

    public Color SelectedColor
    {
        get { return (Color)GetValue(SelectedColorProperty); }
        set { SetValue(SelectedColorProperty, value); }
    }
}

悪ふざけは私が見つけたこの場所layoutRoot.DataContextから来ています。

次に、次のようにコントロールを使用します。

<me:HexColorPicker SelectedColor="{Binding MyColor}"/>

そして、それはある程度機能します。テキスト フィールドとカラー ピッカーは同期しています。一方が変更されると、他方も変更されます。ただし、コントロールとモデル オブジェクトは双方向で同期されません。モデル オブジェクトのMyColorプロパティを変更するとコントロールは更新されますが、コントロールで変更してもMyColorプロパティは更新されません。

私は何を間違っていますか?バインディングがモデルからコントロールへの一方向のみであるのはなぜですか?

4

2 に答える 2

3

DependencyProperty 宣言を次のように変更します。

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
于 2013-03-04T21:20:19.490 に答える
0

私が思い出したように、タイプ間で変換するバインディングは、デフォルトでバインディングになることがありますOneWay

BindingMode.Default の参照から ( http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx ):

バインディング ターゲットのデフォルトの Mode 値を使用します。デフォルト値は、依存関係プロパティごとに異なります。一般に、テキスト ボックスやチェック ボックスのプロパティなど、ユーザーが編集可能なコントロールのプロパティは既定で双方向のバインドに設定されますが、他のほとんどのプロパティは既定で一方向のバインドに設定されます。依存関係プロパティが既定で一方向または双方向のどちらにバインドされるかをプログラムで判断する方法は、GetMetadata を使用してプロパティのプロパティ メタデータを取得し、BindsTwoWayByDefault プロパティのブール値を確認することです。

問題は、コントロールが「ユーザー編集可能な」コントロールとして表示されていないことです。

最も簡単な解決策はMode=TwoWay、バインディングで指定することです。

于 2013-03-04T21:22:50.400 に答える