0

検索してみましたが、検索するのに適切な用語を使用していない可能性があります。

使用しているいくつかのテキストボックスがあり、データを入力すると、デバッグ時に値が更新されていることがわかりますが、フォームに更新されることはありません。

基本的に、ビジュアルに使用されるフォームがあり、すべてのアクティビティを処理するクラスがあります。クラスをリソースとして作成し、テキスト ボックス内のリソースを参照しています。

フォームの更新を処理する方法を本当に知っていた唯一の方法は、値の変更に関する計算を実装することでした。したがって、プロパティを更新した場合は、OnPropertyChanged() からメソッドを呼び出しました。これにより、計算によって値が書き換えられるため、値が常に変更されていたため、問題が発生していました。次に、新しい値の変化を評価してみました

IE

public double In1
{
    get{_return _in1;}
    set{
        if (_in1 != value)
        _in1 = value;

        OnPropertyChanged("In1");
    }
}

何があっても、私の問題は、値がテキストボックスに書き込まれるのを見ないことです。これは、データバインディングを使用する私の最初の実際の取り組みであるため、何か間違ったことを(明らかに)行っていると想定しています

<ad:DockableContent
    xmlns="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" 
    x:Class="DMC_Robot_Editor.GUI.frmAngleConvertor"
    Title="frmAngleConvertor" Height="259" Width="282">
<ad:DockableContent.Resources>       
    <local:AngleConvertor x:Key="Converter"/>
</ad:DockableContent.Resources>
<Grid >    
        <GroupBox HorizontalAlignment="Stretch" VerticalAlignment="Top">
        <Grid>
 <ComboBox  x:Name="cbInput" HorizontalAlignment="Stretch" VerticalAlignment="Top"     Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="1"  DisplayMemberPath="ValueCartesianString"     SelectedValuePath="ValueCartesianEnum" IsSynchronizedWithCurrentItem="True"      SelectedIndex="{Binding InputItem,Source={StaticResource Converter}}" ItemsSource="{Binding InputConvention, Source={StaticResource Converter}}"  IsReadOnly="True"/>
                    <TextBox x:Name="tbIn1" HorizontalAlignment="Center"     VerticalAlignment="Bottom" Text="{Binding In1, Converter={StaticResource DoubleToStringConverter}, Source={StaticResource Converter}}" Grid.Column="0"     d:LayoutOverrides="GridBox" Grid.Row="2" Width="50" TextAlignment="Center">
                        <TextBox.DataContext>
                            <local:AngleConvertor/>
                        </TextBox.DataContext>                    </Grid>
</ad:DockableContent>

public class AngleConverter()
{
    private double _in1 = 0.0;
    public double In1
    {
        get{_return _in1;}
        set{
            if (_in1 != value)
            _in1 = value;

            OnPropertyChanged("In1");
        }
    }
}
4

4 に答える 4

1

UpdateSourceTrigger=PropertyChangedモードでバインディングに追加できますTwoWay

<TextBox Name="tbIn1" 

HorizontalAlignment="Center"     
VerticalAlignment="Bottom" 

Text="{Binding In1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, 
Converter={StaticResource DoubleToStringConverter}, 
Source={StaticResource Converter}}" 

Grid.Column="0"     
d:LayoutOverrides="GridBox" 
Grid.Row="2" 
Width="50" 
TextAlignment="Center"
/> 
于 2012-09-07T12:42:04.553 に答える
1

UpdateSourceTrigger=PropertyChangedテキストボックス に適用してみてください:

Text="{Binding Path-In1, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}, Source={StaticResource Converter}}"  
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
于 2012-09-07T12:12:37.287 に答える
0

実際のコードは次のようになります。

public class AngleConverter : INotifyPropertyChanged

だから私はあなたのコードのタイプミスだと思います。コンバーターコードを投稿していません。テキストボックスのバインドは問題ありません。テキストボックスのデフォルトのUpdateSourceTriggerはlostfocusです。したがって、UpdateSourceTrigger=PropertyChangedが必要な処理を実行した可能性があります。

于 2012-09-07T12:40:33.340 に答える
0

バインディングを確認する
DoubleToStringConverter は呼び出されますか?
呼ばれますか?

Text="{Binding In1, Converter={StaticResource DoubleToStringConverter}, Source={StaticResource Converter}}"

Source をバインドから外して、DockableContent の DataContext に移動します。

DataContext="{Binding RelativeSource={RelativeSource self}}"

コンバーターなしで試す

Text="{Binding In1}"
于 2012-09-07T12:58:19.353 に答える