WPF:如果 属性 发生更改,是否有任何方法可以强制转换器更新?
WPF: Is there any way to force converter to update if its property gets changed?
简介:
这是我在我的应用程序中使用的翻译器的一部分。当我用 ComboBox 更改语言时,我想更新其中的所有字符串。
问题:
当我的 Converters 属性 发生变化时,我想更新标签内容。可能吗?如果我更改 CurrentLanguage,这种方式(我是如何做到的)不会更新内容。
<Label
ID:Name="CompanyName"
Content="{Binding ElementName=CompanyName, Path=Name, Converter={ID:Static Controller:Translator.Instance}}" />
这个 ComboBox 改变了我的当前值 - works
<ComboBox
SelectedItem="{Binding Path=CurrentLanguage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource FlagConverter}}">
翻译器代码隐藏 - 有效(属性更改被解雇)
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
}
我看到了 2 种可能的解决方案:
- 使用多值转换器并绑定到 Name AND CurrentLanguage
- 更像是一个 hack:向 comboxbox.itemchanged 添加事件触发器并使用 Company.Name 重置 Company.Name 的值(setter 被调用 -> 转换器被调用)
解法:
使用 MultiBinding + IMultiValueConverter
ComboBox 保持不变。
编辑 Laber 以使用 MultiBinding。
<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>
将转换器更改为 IMultiValueConverter:
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;
}
非常感谢大家!
简介: 这是我在我的应用程序中使用的翻译器的一部分。当我用 ComboBox 更改语言时,我想更新其中的所有字符串。
问题: 当我的 Converters 属性 发生变化时,我想更新标签内容。可能吗?如果我更改 CurrentLanguage,这种方式(我是如何做到的)不会更新内容。
<Label
ID:Name="CompanyName"
Content="{Binding ElementName=CompanyName, Path=Name, Converter={ID:Static Controller:Translator.Instance}}" />
这个 ComboBox 改变了我的当前值 - works
<ComboBox
SelectedItem="{Binding Path=CurrentLanguage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource FlagConverter}}">
翻译器代码隐藏 - 有效(属性更改被解雇)
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
}
我看到了 2 种可能的解决方案:
- 使用多值转换器并绑定到 Name AND CurrentLanguage
- 更像是一个 hack:向 comboxbox.itemchanged 添加事件触发器并使用 Company.Name 重置 Company.Name 的值(setter 被调用 -> 转换器被调用)
解法: 使用 MultiBinding + IMultiValueConverter
ComboBox 保持不变。
编辑 Laber 以使用 MultiBinding。
<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>
将转换器更改为 IMultiValueConverter:
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;
}
非常感谢大家!