2016-08-22 84 views
1

即时通讯尝试学习如何使用WPF数据绑定。VB.NET WPF数据绑定在控制属性(如何更新)

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

<somecontrol Value="{Binding GoodRange}"> 

我创建的主窗口类的属性,如下所示:

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 

里面的主窗口类添加以下到子新()

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

到目前为止好,hwen我启动程序,将值3000传递给控件。现在

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

Private Sub UpdateValue() 

    GoodRange = 2800 

End Sub 

当我这样做,在控制值不更新。即时通讯试图了解我如何触发控制更新。

我已经搜索了4个小时尝试尝试和理解,我发现并尝试了很多谷歌的答案,但通常这些答案是自定义控件或自定义类或使用.datacontex方法,我不能使用多个财产将需要改变。

我会很乐意为您提供任何帮助。

谢谢/

+3

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

回答

0

正如克莱门斯说,在你的问题的评论,你真的需要做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 
+0

非常感谢Stewbob。这工作得很好,虽然我不得不稍微修改它以适应我目前复杂的程序。虽然我并没有将其最佳做法绑定到hte视图模型中,但我现在不得不使用它,直到我对WPF了解更多。我会阅读你链接的文件,我appriciate你的帮助! –

+0

BTW:Public Event PropertyChanged(ByVal sender As Object,ByVal e As PropertyChangedEventArgs)实现INotifyPropertyChanged.PropertyChanged需要在转换为VB.net时添加 –