【问题标题】:VB.NET WPF Data Binding On Control Property (How to update)VB.NET WPF Data Binding On Control 属性(如何更新)
【发布时间】:2016-12-28 21:56:48
【问题描述】:

我正在尝试学习如何使用 WPF 数据绑定。

我有一个控件,我想更改控件中某个属性的值。

<somecontrol Value="{Binding GoodRange}"> 

我在 MainWindow 类中创建了如下属性:

Public Property GoodRange As Double
    Get
        Return m_GoodRange
    End Get
    Set(value As Double)
        m_GoodRange = value
    End Set
End Property
Private m_GoodRange As Double

在 Mainwindow 类中,我在子 New() 中添加了以下内容

Public Sub New()
       InitializeComponent()
       GoodRange = 3000
       Me.DataContext = Me
End Sub

到目前为止一切顺利,当我启动程序时,值 3000 被传递给控件。

现在,在运行时我想更改属性,例如当用户单击按钮或定时事件时,例如:

Private Sub UpdateValue()

    GoodRange = 2800

End Sub

当我这样做时,控件上的值不会更新。我试图了解如何触发控件进行更新。

我已经用 google 搜索了 4 个小时,尝试理解,我在 google 上找到并尝试了很多答案,但通常这些答案是针对自定义控件或自定义类或使用我无法用作多个的 .datacontex 方法属性将需要更改。

如果你们能提供任何帮助,我将不胜感激。

谢谢/

【问题讨论】:

  • 您必须实现属性更改通知。这通常通过实现 INotifyPropertyChanged 接口来完成。但是请注意,在视图类(如您的 MainWindow)中实现这一点并不常见。您通常创建一个单独的类来实现它并定义绑定的源属性。然后将该类的一个实例分配给视图的 DataContext。这就是所谓的视图模型。在网上搜索 MVVM。

标签: wpf vb.net data-binding


【解决方案1】:

正如 Clemens 在对您的问题的评论中所说,您确实需要对 MVVM 进行一些研究,它以数据绑定为核心和灵魂。一篇优秀的文章当然是 Josh Smith 的经典文章,MVVM Design Pattern

同时,作为一个最小功能示例,您应该创建一个如下所示的实现 INotifyPropertyChanged 接口的类(下面的代码是 C#):

public class myViewModel : INotifyPropertyChanged
{

    private double goodRange = 3000;
    public double GoodRange
    {
        get
        {
            return goodRange;
        }
        set
        {
            if (value != goodRange)
            {
                goodRange = value;
                NotifyPropertyChanged("GoodRange");
            }
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

在窗口后面的代码中:

Dim mVM as myViewModel

Public Sub New()
   InitializeComponent()
   mVM = new myViewModel()
   Me.DataContext = mVM
End Sub

Private Sub UpdateValue()
   mVM.GoodRange = 2800
End Sub

【讨论】:

  • 非常感谢 Stewbob。这很好用,尽管我不得不稍微修改它以适应我当前的复杂程序。虽然我知道在 hte 视图模型中绑定不是最佳实践,但这是我现在必须使用的东西,直到我了解更多关于 WPF 的信息。我会阅读您链接的文档,并感谢您的帮助!
  • BTW:Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) 实现 INotifyPropertyChanged.PropertyChanged 需要在转换为 VB.net 时添加
猜你喜欢
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2014-04-14
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多