2013-03-18 13 views
0

我一直在嘗試獲取數據綁定的句柄,並且遇到了麻煩使其工作。有人能指引我朝着正確的方向嗎?數據綁定不能在WPF中使用VB.NET

我使用VS2012並在WPF/vb.net中編程。我有一個xaml UI,一個更新屬性的類,以及運行我的主循環的模塊。我試圖根據模塊中的動態數據更新UI中的文本塊。

下面是從UI的重要XAML:

<Page x:Class="pPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:BMI_WPF_v1" 
    mc:Ignorable="d" 
    Title="BMI"> 

<Page.Resources> 
    <local:clsItemGUI x:Key="clsitemgui" /> 
</Page.Resources> 

<TextBlock x:FieldModifier="public" x:Name="p_force" Text="{Binding Path=Force, UpdateSourceTrigger=PropertyChanged}" /> 

這裏是我打電話給我的主模塊中嘗試更新GUI:

Dim bmiUI As New clsItemGUI 
bmiUI.UpdateForce(currentForce) 

這裏還有一個,就是類更新GUI:

Imports System.Collections.ObjectModel 
Imports System.ComponentModel 

Public Class clsItemGUI 
Implements INotifyPropertyChanged 

Private ForceValue As Double 

Sub New() 
End Sub 

Public Sub UpdateForce(ByVal inputForce As String) 
    Me.ForceValue = inputForce 
End Sub 

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

Public Property Force() As Double 
    Get 
     Return ForceValue 
    End Get 
    Set(ByVal value As Double) 
     ForceValue = value 
     OnPropertyChanged("Force") 
    End Set 
End Property 

Protected Sub OnPropertyChanged(ByVal name As String) 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) 
End Sub 

End Class 

它看起來像我更新ForceValue,但這不是觸發UI上的更新。顯然我錯過了一些愚蠢的東西,但是我還沒有找到合適的資源。

+0

我認爲你需要設置你的類到頁面數據上下文而不是資源 – failedprogramming 2013-03-18 20:28:47

+0

嗯,我以爲我已經這樣做了?你能舉一個你的意思嗎? – gadget00 2013-03-18 20:45:53

回答

0

試試這個

添加的datacontext下頁資源

<Page.DataContext> 

    <local:clsItemGUI/> 

</Page.DataContext> 

(與模式=雙向)

<TextBlock x:FieldModifier="public" x:Name="p_force" Text="{Binding Path=Force, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
+0

感謝您的快速響應,J King。現在文本塊讀取「0」(它曾經是空白),但它仍然不會更新。我正在瀏覽代碼,我可以看到我將我的強制變量傳遞給Me.ForceValue。然而,我的兩個斷點在: 返回ForceValue 和 RaiseEvent PropertyChanged(Me,New PropertyChangedEventArgs(name)) ...永遠不會到達。 – gadget00 2013-03-18 20:41:31

0

您必須指定DataContext根佈局(在我的例子是Grid):

<Grid DataContext="{StaticResource clsitemgui}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30" /> 
     <RowDefinition Height="30" /> 
    </Grid.RowDefinitions> 

    <TextBlock x:FieldModifier="public" x:Name="p_force" Text="{Binding Path=Force, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <Button x:Name="btn" Grid.Row="1" Content="Change" Click="Button_Click" />   
</Grid> 

,或者你可以設置Source屬性,當你綁定,就像這樣:

<TextBlock x:FieldModifier="public" x:Name="p_force" Text="{Binding Path=Force, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

你也有錯誤UpdateForce方法,你應該不分配新值Force財產ForceValue領域。當您將此值分配給字段OnPropertyChanged時,它不會被調用。

Public Class clsItemGUI 
    Implements INotifyPropertyChanged 

    Private ForceValue As Double 

    Sub New() 
     Force = 2.5 
    End Sub 

    Public Sub UpdateForce(ByVal inputForce As Double) 
     Me.Force = inputForce 
    End Sub 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

    Public Property Force() As Double 
     Get 
      Return ForceValue 
     End Get 
     Set(ByVal value As Double) 
      ForceValue = value 
      OnPropertyChanged("Force") 
     End Set 
    End Property 

    Protected Sub OnPropertyChanged(ByVal name As String) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) 
    End Sub 

End Class 

當你更新你應該做的,你分配爲DataContext所以你應該施放此對象,並對其調用UpdateForce功能對當前對象:

Private Sub Button_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    Dim dt As clsItemGUI 
    dt = CType(btn.DataContext, clsItemGUI) 
    dt.UpdateForce(5.2) 
End Sub 
+0

Kmatyaszek,我嘗試了這兩個更改,但我的UI仍未更新。然而,我現在只在第一次加載程序時(在UI出現之前)觸及「返回ForceValue」的斷點。 – gadget00 2013-03-18 20:55:32

+0

@ gadget00再次檢查我的答案:) – kmatyaszek 2013-03-18 20:59:31

+0

啊!現在我們正在用煤氣做飯。現在,當我遍歷代碼時,我點擊了UpdateForce函數,該函數觸發Force()屬性函數,然後觸發OnPropertyChanged函數。但是,它仍然沒有更新UI。我的用戶界面現在讀取2.5,不斷。 – gadget00 2013-03-18 21:05:56