转换器中的更改将通知绑定属性的更改?

时间:2010-12-22 07:52:19

标签: wpf

我有两个属性FirstName和LastName,并使用Multibinidng和converter绑定到文本块,以将FullName显示为FirstName + Last Name。

姓="纪"    名字="库马尔"

在转换器中,我将LastName更改为"更改了文本"

values[1] = "Changed Text";

执行转换器后,我的TextBlock将显示" Kishore Changed Text"但依赖属性LastName仍然具有最后一个值" Kumar"。为什么我没有收到"更改的文字"执行后LastName属性中的值?

转换器的更改是否会通知绑定的属性?

 <Window.Resources>
    <local:NameConverter x:Key="NameConverter"></local:NameConverter>
</Window.Resources>
<Grid>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource NameConverter}">
                <Binding Path="FirstName"></Binding>
                <Binding Path="LastName"></Binding>
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
 </Grid>

转换器:

 public class NameConverter:IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        values[1] = "Changed Text";
        return values[0].ToString() + " " + values[1].ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

2 个答案:

答案 0 :(得分:0)

在Convert方法中作为参数获得的object []是评估两个绑定后的属性值。已将属性的值复制到数组中,并通过为元素指定值,只更改数组,而不是更改值的属性。

如果要更改具有这些属性的原始对象,可以为该类创建一个普通的valueconverter并绑定到该对象本身。像这样:

public class NameConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Person p = value as Person;
        if (p == null) { return null; }
        p.LastName = "Changed Text";
        return p.FirstName + " " + p.LastName;
    }
// ...
}

当然,那么就不需要MultiBinding了。你可以绑定到对象本身:

<TextBlock Text="{Binding Converter={StaticResource NameConverter}}"/>

答案 1 :(得分:0)

  

转换器的更改是否会通知绑定的属性?

没有。转换器用于转换绑定值 - 而不是修改它们。您应该在更合适的位置执行此操作,例如依赖属性强制或视图模型。