我正在为一些遗留代码制作适配器类。我想在我的视图上的依赖项属性和我的viewmodel上的属性之间进行双向绑定。但是,我希望初始绑定对目标属性具有权威性。我承认默认情况下绑定引擎不是以这种方式工作的(我当然希望我不必提出这样的解决方案)。
这是我想要完成的事情的本质。
我有一个基础的自定义控件类,我的视图继承自:
public class MyViewBase : UserControl
{
public static readonly DependencyProperty MyTargetProperty =
DependencyProperty.Register("MyTarget",
typeof(bool),
typeof(MyViewBase),
new PropertyMetadata(true));
protected MyViewBase()
{
// Target property is initialized to a value
// specified by the constructor of this class.
MyTarget = true;
}
public bool MyTarget
{
get { return (bool)GetValue(MyTargetProperty); }
set { SetValue(MyTargetProperty, value); }
}
}
一个viewmodel,它有一个我希望双向绑定到视图的属性,但是我希望从视图中初始化它的值,而不是相反:
public sealed class MyViewModel : INotifyPropertyChanged
{
private bool m_mySource;
public bool MySource
{
get { return m_mySource; }
set
{
m_mySource = value;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs("MySource"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
最后,从我的基本自定义控件派生的视图,其中目标依赖项属性绑定到viewmodel上的source属性:
<local:MyViewBase
x:Class="TwoWayBindingTest.MyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TwoWayBindingTest"
Title="MyView"
SizeToContent="WidthAndHeight"
MyTarget="{Binding Path=MySource, Mode=TwoWay}">
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<CheckBox
IsChecked="{Binding Path=MySource}">My Source</CheckBox>
</local:MyViewBase>
目前,加载视图,初始化绑定,目标属性从源接收值。因此,即使我已将目标依赖项属性值初始化为true,它也会被我的viewmodel中的默认值覆盖:在这种情况下,为false。
我想要做的是让视图加载,然后将source属性设置为target属性的初始化值,类似于OneWayToSource绑定的行为。之后,双向绑定将正常运行。
正如我所说,我意识到这与绑定引擎的设计方式完全一致,而且我正在寻找“滥用”它。任何解决方法的想法?