2013-03-04 23 views
0

我已經創建了一個顯示ColorPicker(從WPF工具包擴展)和它的十六進制代碼的文本字段一個非常簡單的用戶控件:我的WPF用戶控件具有單向綁定,我不知道爲什麼

<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有心計來自this place I found

然後我用我的控制這樣的:

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

它有點工作。文本字段和顏色選擇器是同步的:當一個變化時,另一個變化。但是,控件和模型對象不是雙向同步的:如果更改模型對象的MyColor屬性,我的控件將更新,但使用我的控件更改時,MyColor屬性不會更新。

我在做什麼錯?爲什麼從我的模型到我的控制的單向綁定?

回答

2

更改您的DependencyProperty宣言:

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 
+0

我有些驚訝,微軟的人認爲它不應該是默認的雙向。 – zneak 2013-03-04 21:24:32

+0

@zneak有很多情況下'TwoWay'沒有什麼意義。 – 2013-03-04 21:25:44

+0

我真的不能想到任何情況下控件會想要修改自己的屬性,但不會將其同步回模型。我可以想象,雙向綁定對於控件本身不會改變的屬性沒有用處,但正因爲如此,它也不會有害。 – zneak 2013-03-04 21:30:38

0

我記得,那個類型之間轉換綁定有時默認爲 OneWay結合。

從BindingMode.Default(http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx)基準:

採用結合靶的默認模式值。每個依賴項屬性的默認值都不相同。通常,用戶可編輯的控件屬性(如文本框和複選框的屬性)默認爲雙向綁定,而大多數其他屬性默認爲單向綁定。確定依賴項屬性默認綁定單向還是雙向的編程方法是使用GetMetadata獲取屬性的屬性元數據,然後檢查BindsTwoWayByDefault屬性的布爾值。

看起來問題在於您的控件不被視爲「用戶可編輯」控件。

最簡單的解決方案是在您的綁定中指定Mode=TwoWay

+0

「最簡單的解決方案是在您的綁定中指定Mode = TwoWay」。這是錯誤的。如果你想讓你的依賴屬性默認綁定雙向*,唯一的方法就是設置'FrameworkPropertyMetadataOptions.BindsTwoWayByDefault'標誌,如其他答案所示。 – Clemens 2013-03-04 21:29:56

+0

我不會說這是錯的,只是主觀的。 – 2013-03-04 21:31:12

+0

重新考慮*默認*部分。 – Clemens 2013-03-04 21:32:31

相關問題