C# WPF:如果转换器的属性发生更改,有没有办法强制转换器更新?
简介: 这是我在应用程序中使用的翻译器的一部分。我想在使用组合框更改语言时更新其中的所有字符串 问题: 我想在转换器属性更改时更新标签内容。可能吗?这种方式(我是如何制作的)不会在我更改当前语言时更新内容C# WPF:如果转换器的属性发生更改,有没有办法强制转换器更新?,c#,wpf,xaml,inotifypropertychanged,ivalueconverter,C#,Wpf,Xaml,Inotifypropertychanged,Ivalueconverter,简介: 这是我在应用程序中使用的翻译器的一部分。我想在使用组合框更改语言时更新其中的所有字符串 问题: 我想在转换器属性更改时更新标签内容。可能吗?这种方式(我是如何制作的)不会在我更改当前语言时更新内容 <Label ID:Name="CompanyName" Content="{Binding ElementName=CompanyName, Path=Name, Converter={ID:Static Controller:Translator.Insta
<Label
ID:Name="CompanyName"
Content="{Binding ElementName=CompanyName, Path=Name, Converter={ID:Static Controller:Translator.Instance}}" />
我认为有两种可能的解决方案:
- 使用多值转换器并绑定到Name和CurrentLanguage
- 更像是一个黑客:向comboxbox.itemchanged添加一个eventtrigger,并用Company.Name重置Company.Name的值(setter调用->converter调用)
- 解决方案:
使用多绑定+IMultiValueConverter
组合框保持不变
编辑标签以使用多重绑定
<Label
ID:Name="CompanyName"
<Label.Content>
<MultiBinding Converter="{ID:Static Controller:Translator.Instance}">
<Binding ElementName="CompanyName" Path="Name"/>
<Binding Source="{ID:Static Controller:Translator.Instance}" Path="CurrentLanguage"/>
</MultiBinding>
</Label.Content>
</Label>
这很奇怪。您甚至没有将转换器用作转换器。您正在将一个元素绑定到自身?@Sinatr我将查看这两个元素,谢谢:)这样就不会有内存泄漏=)@bum是的,它工作得非常好,我只需设置一个转换器使用它的名称,然后将它翻译成一个字符串,它可以在我的translations.XML中找到,这个名字就像是字典的钥匙:)但它不起作用,对我来说仍然很奇怪@我将尝试多值转换器,并将报告,这听起来很有希望=)我将首先尝试第一个解决方案,因为其他人也提到了它。我想到了第二种方法,但我想要一种更有效的方法来实现它,因为我不想使用成员来存储XAML可以自己管理的东西。另外,我在代码中有多个ItemsControls,这会大大增加内存使用量(每个控件的标签+工具提示翻译),在阅读了一些关于它们的内容后,我发现:看起来很有希望。这就是你不从书中学习WPF所得到的结果,而是通过尝试失败学习方法:DMultiValueConverter按预期工作,真是太多了!(我的投票不起作用,因为我的代表性还很高)
public partial class Translator : IValueConverter, INotifyPropertyChanged
{
...
private String m_currentLanguage;
public String CurrentLanguage
{
get { return m_currentLanguage; }
set
{
m_currentLanguage = value;
OnPropertyChanged("CurrentLanguage");
}
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Get((String)value); // nonrelevant function - works
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return GetOriginal((String)value); // nonrelevant function - works
}
#region Events
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
<Label
ID:Name="CompanyName"
<Label.Content>
<MultiBinding Converter="{ID:Static Controller:Translator.Instance}">
<Binding ElementName="CompanyName" Path="Name"/>
<Binding Source="{ID:Static Controller:Translator.Instance}" Path="CurrentLanguage"/>
</MultiBinding>
</Label.Content>
</Label>
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((values[0] as String).Length <= 0)
return ""; // prevents error messages for binds on element names
return Get((String)values[0]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}