gpt4 book ai didi

c# - MultiBinding 和 IMultiValueConverter Convert() 只调用一次

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:07 24 4
gpt4 key购买 nike

问:为什么我使用 MultiBinding 和 IMultiValueConverter 的自定义 TextBox UserControl 的 Convert() 方法只被调用一次(在实例化期间)??

我已经定义了一个 UserControl,它需要一个 MultiBinding 和一个 IMultiValueConverter,以便根据 2 个独立的 DependencyProperty 更改其行为/表示。

<proj:MyControl Value="10" Digits="1" />

用户控件:

<UserControl x:Class="MyControl"
x:Name="uc"
...>

<UserControl.Resources>
<conv:DecimalToStringMultiConverter x:Key="DecToString" />
</UserControl.Resources>

[...]

<Grid>
<ctrl:VTextBox x:Name="vTb" Grid.Column="0" Margin="0,0,2,0">
<ctrl:VTextBox.Text>
<MultiBinding Converter="{StaticResource DecToString}" UpdateSourceTrigger="LostFocus" Mode="TwoWay">
<Binding ElementName="uc" Path="Value" Mode="TwoWay" />
<Binding ElementName="uc" Path="Digits" Mode="TwoWay" />
</MultiBinding>
</ctrl:VTextBox.Text>
</ctrl:VTextBox>
</Grid>
</UserControl>

当执行应用程序时,UserControls 都被正确地实例化了。但是,IMultiValueConverter.Convert() 方法仅调用一次

使用一个简单的 Binding + IValueConverter 和一个常量 ConvertParameter 效果很好:转换器的 Convert() 方法每次包含在 UserControl 中的 TextBox 的 Text 属性发生变化时都会被调用。

设计改变了,我不得不求助于使用 MultiBinding + IMultiValueConverter,现在 Convert() 方法只被调用一次,并且 TextBox.Text 属性永远不会在 LostFocus() 事件上更新。

什么给了?

MultiValueConverter 定义如下。我只是将 IMultiValueConverter 包装在 IValueConverter 上以重用现有代码。

[ValueConversion(/*sourceType*/ typeof(Decimal), /*targetType*/ typeof(string))]
public class DecimalToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return "0.00";

int? digits = parameter as int?;

if(digits == null)
digits = 2;

NumberFormatInfo nfi = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = " ";
nfi.CurrencyDecimalSeparator = ".";
nfi.NumberDecimalDigits = (int)digits;

return ((decimal)value).ToString("n", nfi);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return 0.00m;

decimal d;

return decimal.TryParse((string)value, out d) ? d : 0.00m;
}
}

[ValueConversion(/*sourceType*/ typeof(Decimal), /*targetType*/ typeof(string))]
public class DecimalToStringMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
DecimalToStringConverter conv = new DecimalToStringConverter();
return conv.Convert(values[0], targetType, values.Length > 1 ? values[1] : null, culture);
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
DecimalToStringConverter conv = new DecimalToStringConverter();
return new[] { conv.ConvertBack(value, targetTypes[0], null, culture) };
}
}

最佳答案

您似乎对 Binding 和 TextBox 的更新行为有一些相互矛盾的期望。多次调用 Convert 的唯一原因是 Digits 或 Value 的值多次更改,并且您发布的代码中没有任何内容表明会发生这种情况。对 TextBox.Text 的更改不会引起对 Convert 的调用,而是应该在每次更改 +LostFocus 时调用 ConvertBack。您在运行代码时看到了吗?

您还需要从 ConvertBack 方法返回两个值,而不是现在的值,以便为 MultiBinding 中使用的两个绑定(bind)提供值。

关于c# - MultiBinding 和 IMultiValueConverter Convert() 只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3556962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com