首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiBinding和IMultiValueConverter转换()只调用一次

MultiBinding和IMultiValueConverter转换()只调用一次
EN

Stack Overflow用户
提问于 2010-08-24 13:33:15
回答 1查看 4.3K关注 0票数 2

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

我已经定义了一个UserControl,它需要一个MultiBinding和一个IMultiValueConverter来改变它在2个独立的DependencyProperty上的行为/表示。

代码语言:javascript
复制
<proj:MyControl Value="10" Digits="1" />

UserControl:

代码语言:javascript
复制
<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非常有效:每当包含在UserControl中的TextBox更改其文本属性时,都会调用转换器的Convert()方法。

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

怎么回事?

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

代码语言:javascript
复制
[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) };
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-24 23:41:44

对于绑定和TextBox的更新行为,您似乎有一些相互矛盾的期望。转换将被多次调用的唯一原因是,如果数字或值的值发生多次变化,并且在您发布的代码中没有任何东西表示会发生这种情况。对TextBox.Text的更改不会导致调用转换,而是应该在每个change+LostFocus上调用ConvertBack。当你运行你的代码时,你看到了吗?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3556962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档