In the WinFX SDK ColorPicker sample
(http://windowssdk.msdn.microsoft.com...sp?frame=true),
a MultiBinding object is created to keep the Color, Red, Green, Blue
dependency properties in sync:
private void SetupColorBindings()
{
MultiBinding binding = new MultiBinding();
binding.Converter = new ByteColorMultiConverter();
binding.Mode = BindingMode.TwoWay;
Binding redBinding = new Binding("Red");
redBinding.Source = this;
redBinding.Mode = BindingMode.TwoWay;
binding.Bindings.Add(redBinding);
Binding greenBinding = new Binding("Green");
greenBinding.Source = this;
greenBinding.Mode = BindingMode.TwoWay;
binding.Bindings.Add(greenBinding);
Binding blueBinding = new Binding("Blue");
blueBinding.Source = this;
blueBinding.Mode = BindingMode.TwoWay;
binding.Bindings.Add(blueBinding);
this.SetValue(ColorProperty,
((MarkupExtension)binding).ProvideValue(this, ColorProperty));
}
I assume the last line can be replaced with:
SetBinding(ColorProperty, binding);
which is much more readable.
However, this sync can be easily broken by the consumer of assigning another
binding to ColorPicker.Color property: simply change the Window1.xaml as
following:
<Window x:Class="ColorPickerApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ColorPickerApp"
xmlns:cp="clr-namespace:ColorPickerLib;assembly=ColorPickerLib">
<Grid>
<StackPanel HorizontalAlignment="Left" Margin="20">
<StackPanel.Resources>
<Color x:Key="MyColor">Blue</Color>
</StackPanel.Resources>
<cp:ColorPicker Name="colorPicker" Color="{Binding Source={StaticResource
MyColor}}"/>
</StackPanel>
</Grid>
</Window>
It seems the actual instance binding object (BindingExpression or whatever)
can only be attached to a dependency property; and setting binding on the
denpendency property will overwrite the previous one. What is the appropriate
way to keep the dependency properties in sync (override OnPropertyChange does
not sound a good idea either)? In my opinion, the internal state of the class
should never be broken by the consumer of the class.


