【问题标题】:Multi stage databinding with a custom usercontrol具有自定义用户控件的多阶段数据绑定
【发布时间】:2017-08-14 09:59:57
【问题描述】:

我有一个带有 ViewModel 的自定义控件。在这个控件中,我以编程方式将控件的属性绑定到 ViewModel。

当我使用控件并绑定到属性时,值不会更新。我有这个用于绑定

在 customControl ViewModel 中

    private string _InitValue;

    public string InitValue
    {
        get { return _InitValue; }
        set { _InitValue = value; NotifyPropertyChanged();}
    }

在 customControl 中我设置了绑定

    initValueBinding = new Binding();
    initValueBinding.Source = LocalDataContext;
    initValueBinding.Path = new PropertyPath("InitValue");
    initValueBinding.Mode = BindingMode.OneWayToSource;
    initValueBinding.BindsDirectlyToSource = true;
    initValueBinding.UpdateSourceTrigger = UpdateSourceTrigger.Default;
    BindingOperations.SetBinding(this, PlusMinControl.InitValueProperty, initValueBinding);

InitValueProperty 是一个依赖属性。

    public static DependencyProperty InitValueProperty = DependencyProperty.Register(nameof(InitValue), typeof(string), typeof(PlusMinControl), new PropertyMetadata( new PropertyChangedCallback(test)) );
    private static void test(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ;
    }
    public string InitValue
    {
        get { return ((string)(base.GetValue(PlusMinControl.InitValueProperty))); }
        set { base.SetValue(PlusMinControl.InitValueProperty, value); }
    }

对于customControl的实现

     <plm:PlusMinControl InitValue="{Binding InitVal}" />

在后面的代码中,我设置了数据上下文,并将 InitVal 定义为普通属性。

当我调试代码时,我可以跟踪更改直到 PropertyChangedCallback 但视图模型中的属性没有更新。

谁能告诉我我做错了什么?以及我应该如何解决这个问题。

谢谢!

【问题讨论】:

  • 这是什么InitValue="{Binding InitVal}":ViewModel 中的InitVal 属性在哪里?您在 ViewModel 中显示InitValue,奇怪的是您的 dp 和 VM 属性具有相同的名称...您还在做为什么 xaml 和代码隐藏绑定?
  • 编码绑定在控件 PlusMinControl 中进行。 xaml 绑定是实现 PlusMinControl 的地方。 InitVal 在实现的数据上下文中定义。我希望这能澄清我的结构。

标签: c# wpf mvvm data-binding binding


【解决方案1】:

你已经反转和混合了相同的初始化:

这使得绑定属性=viewmodel

<plm:PlusMinControl InitValue="{Binding InitVal}" />

还有这个

"initValueBinding = new Binding();....."

这个肯定够了,去掉绑定代码

<plm:PlusMinControl InitialValue ="{Binding InitValue}" />

在控件中将属性改为InitialValue

【讨论】:

【解决方案2】:

将 BindingMode.OneWayToSource 更改为 BindingMode.TwoWay

【讨论】:

  • 我尝试将两个绑定都设置为 TwoWay,并且只设置控件中的绑定,但这没有区别。它停在 PropertyChangedCallback
  • 私有静态 void OnImageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(d)) return; PageControl element = d as PageControl; if (e.NewValue != null) { element.ManageScool(); element.Fit(e.NewValue as ImageSource); } }
  • 基本上这意味着您在视图模型中再次设置变量的属性更改事件?
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多