我试过搜索,但可能我没有使用正确的术语来搜索。
我有几个正在使用的文本框,当我输入数据时,我看到调试时更新了值,但它们从未更新到表单中。
基本上,我有一个用于视觉效果的窗体,然后我有了一个处理所有活动的类。我已经将类创建为一个资源,并且在文本框中引用该资源。
我真正知道如何处理表单更新的唯一方法是实现对值更改的计算。因此,如果我更新了一个属性,我会从OnPropertyChanged()调用该方法。这产生了问题,因为由于计算重写值,值总是会发生更改。然后我尝试评估新值的变化
即
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");
}
}
}
尝试在文本框上应用UpdateSourceTrigger=PropertyChanged
:
Text="{Binding Path-In1, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToStringConverter}, Source={StaticResource Converter}}"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您可以使用模式TwoWay
将UpdateSourceTrigger=PropertyChanged
添加到绑定中
<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"
/>
您的真实代码应该有这样的东西:
public class AngleConverter : INotifyPropertyChanged
所以我认为这只是你代码中的一个拼写错误。你没有发布转换器代码,你的文本框中的绑定是可以的。文本框默认的UpdateSourceTrigger是lostfocus。所以也许UpdateSourceTrigger=PropertyChanged做了您想要的。
查看绑定
是否调用DoubleToStringConverter
是被叫吗?
Text="{Binding In1, Converter={StaticResource DoubleToStringConverter}, Source={StaticResource Converter}}"
将绑定中的Source移出DockableContent上的DataContext。
DataContext="{Binding RelativeSource={RelativeSource self}}"
尝试无转换器
Text="{Binding In1}"