两个文本框中的一个未使用绑定进行更新
本文关键字:未使用 绑定 更新 一个 两个 文本 | 更新日期: 2023-09-27 18:29:52
我有两个搜索文本框Above
和Below
,必须对它们设置限制。Below
中的数字不能高于Above
中的数字,Above
中的数字也不能低于Below
中的数字。
如果一个数字不对,则应将其设置为等于另一个数字。
问题是CCD_ 7没有得到更新,而CCD_ 8(即使以相同方式设置属性)。
xaml:
<common:SearchTextBox Grid.Column="1"
VerticalAlignment="Center"
Label="Enter value in feet"
common:AllowableTextInput.IsIgnoreWhiteSpace="True"
common:AllowableTextInput.IsMatch="^[0-9]{0,5}$"
Text="{Binding Path=AboveAircraft, UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource AboveAircraftConveter}, ConverterParameter=4000}"/>
<Label Grid.Row="1" Grid.Column="0"
Style="{StaticResource FormLabelStyle}"
Content="Below Aircraft (ft):"/>
<common:SearchTextBox Grid.Row="1" Grid.Column="1"
VerticalAlignment="Center" HorizontalAlignment="Stretch"
common:AllowableTextInput.IsIgnoreWhiteSpace="True"
common:AllowableTextInput.IsMatch="^[0-9]{0,5}$"
Text="{Binding Path=BelowAircraft, UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource BelowAircraftConveter}, ConverterParameter=2000}"
Label="Enter value in feet" />
C#:
public int AboveAircraft
{
get { return _above; }
set
{
if (SetProperty(ref _above, value, "AboveAircraft") && _updateModel)
{
if (Model.AltitudeBand == null)
{
Model.AltitudeBand = new AltitudeBand();
}
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AboveAircraft"));
if (_above < _below)
{
_below = AboveAircraft;
}
}
Model.AltitudeBand.Above = new AltitudeBandLimit() { Unit = AltitudeUnit.Foot, Value = _above };
}
}
}
/// <summary>
/// Below the route of flight in ft
/// </summary>
public int BelowAircraft
{
get { return _below; }
set
{
if (SetProperty(ref _below, value, "BelowAircraft") && _updateModel)
{
if (Model.AltitudeBand == null)
{
Model.AltitudeBand = new AltitudeBand();
}
if (PropertyChanged != null)
{
_below = value;
PropertyChanged(this, new PropertyChangedEventArgs("BelowAircraft"));
if (_below > _above)
{
AboveAircraft = _below;
}
}
Model.AltitudeBand.Below = new AltitudeBandLimit() { Unit = AltitudeUnit.Foot, Value = _below };
}
}
}
您在AboveAircraft
setter方法中使用_below = AboveAircraft;
,但您正在绑定BelowAircraft
。
要么将_below = AboveAircraft;
更改为BelowAircraft = AboveAircraft;
,要么也发送BelowAircraft
的通知,即
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AboveAircraft"));
if (_above < _below)
{
_below = AboveAircraft;
PropertyChanged(this, new PropertyChangedEventArgs("BelowAircraft"));
}
}
当您更改的属性更改了另一个绑定的属性时,必须同时向两个属性发送通知,而不是仅向其中一个发送通知。
当然,您也必须对BelowAircraft
设置器应用相同的更改。
编辑:澄清一下:两种方法中的哪一种取决于设置属性是否会触发循环事件。如果它会导致循环事件(即无休止的触发),那么你只需要像上面的代码一样发送第二个通知。
编辑2:作为对注释的回复,您的XAML绑定被设置为UpdateSourceTrigger=PropertyChanged
。这意味着,您的setter
将使用您键入的每个字符进行调用。
当您输入"4000"时,"上方"字段中的第一个字符将为4,这将导致下方值为4。相反,您希望仅在用户完成输入时更新"文本"字段。
根据MSDN的"UpdateSourceTrigger枚举"文档,有4个值。对于文本字段,您可能希望使用UpdateSourceTrigger=Default
或UpdateSourceTrigger=LostFocus
。然后,只有当用户完成输入时才会调用setter,而不是对文本字段中键入的每个字符调用setter。