目标权威的双向绑定

时间:2014-05-06 23:54:04

标签: c# wpf

我正在为一些遗留代码制作适配器类。我想在我的视图上的依赖项属性和我的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绑定的行为。之后,双向绑定将正常运行。

正如我所说,我意识到这与绑定引擎的设计方式完全一致,而且我正在寻找“滥用”它。任何解决方法的想法?

0 个答案:

没有答案