我有两个属性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
}
答案 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)
转换器的更改是否会通知绑定的属性?
没有。转换器用于转换绑定值 - 而不是修改它们。您应该在更合适的位置执行此操作,例如依赖属性强制或视图模型。