0

私はデータ バインディングを処理しようとしてきましたが、それを機能させるのに問題があります。誰かが私を正しい方向に向けることができますか?

私は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 の更新をトリガーしていません。明らかに、私は何かばかげたことを見逃していますが、まだ適切なリソースを見つけていません。

4

2 に答える 2

0

これを試して

ページ リソースの下に datacontext を追加する

<Page.DataContext>

  <local:clsItemGUI/>

</Page.DataContext>

(mode=TwoWay の場合)

<TextBlock x:FieldModifier="public" x:Name="p_force" Text="{Binding Path=Force, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
于 2013-03-18T20:30:38.303 に答える
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
于 2013-03-18T20:35:06.120 に答える