2013-03-18 4 views
0

데이터 바인딩에서 핸들을 얻으려고했는데 제대로 작동하지 못했습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?WPF에서 데이터 바인딩이 작동하지 않습니다. VB

저는 VS2012를 사용하고 WPF/vb.net에서 프로그래밍하고 있습니다. xaml UI, 속성을 업데이트하는 클래스 및 메인 루프를 실행하는 모듈이 있습니다. 모듈의 동적 데이터를 기반으로 UI의 텍스트 블록을 업데이트하려고합니다. 여기

<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 업데이트를 시도하는 것 :

다음은 UI에서 중요한 XAML입니다

Dim bmiUI As New clsItemGUI 
bmiUI.UpdateForce(currentForce) 

을 그리고 여기에 의미 클래스의 GUI를 업데이트하는 방법 :

ForceValue를 업데이트하는 것처럼 보이지만 트리거되지 않습니다. UI 업데이트. 분명히 나는 ​​바보 같은 것을 놓치고 있지만, 아직 올바른 리소스를 발견하지 못했습니다.

+0

을 내가 당신을 설정할 필요가 있다고 생각 클래스 대신 리소스 대신 페이지 데이터 컨텍스트를 사용하십시오 – failedprogramming

+0

흠, 내가 그랬다고 생각 했나요? 무슨 뜻인지 예를 들려 줄 수 있니? – gadget00

답변

0

<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"(공백으로 사용됨)을 읽지 만 여전히 업데이트되지 않습니다. 코드를 살펴 보았고 Force 변수를 Me.ForceValue에 전달한다는 것을 알 수 있습니다. 그러나 내 두 개의 중단 점은 다음과 같습니다. Return ForceValue 및 RaiseEvent PropertyChanged (Me, 새 PropertyChangedEventArgs (이름)) ... 절대로 도달하지 않습니다. – gadget00

0

(모드 = 양방향으로) 당신은 (내 예제는 Grid을의) 루트 레이아웃에 DataContext를 할당해야 페이지 자원에서 데이터 컨텍스트 추가하려고 :

<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}" /> 

당신은 당신이 ForceValue 필드로하지 Force 속성에 새 값을 할당해야 UpdateForce 방법도 오류가 있습니다. 이 값을 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가 아직 업데이트되지 않았습니다. 그러나, 이제는 "Return ForceValue"에 중단 점을 지정합니다. UI를 시작하기 전에 프로그램을 처음로드 할 때 한 번만입니다. – gadget00

+0

@ gadget00 다시 내 대답을 확인하십시오 :) – kmatyaszek

+0

아!이제 우리는 가스로 요리하고 있습니다. 이제 코드를 단계별로 살펴보면서 ForceFor() 속성 함수와 OnPropertyChanged 함수를 트리거하는 UpdateForce 함수를 사용했습니다. 그러나 여전히 UI가 업데이트되지 않습니다. 내 UI는 이제 2.5, 끊임없이 읽습니다. – gadget00

관련 문제