【问题标题】:WPF: Is there any way to force converter to update if its property gets changed?WPF:是否有任何方法可以强制转换器在其属性发生更改时进行更新?
【发布时间】:2015-10-03 05:34:57
【问题描述】:

简介: 这是我在应用程序中使用的翻译器的一部分。当我使用 ComboBox 更改语言时,我想更新其中的所有字符串。

问题: 当我的 Converters 属性发生更改时,我想更新标签内容。可能吗?如果我更改 CurrentLanguage,这种方式(我是如何做到的)不会更新内容。

 <Label
      ID:Name="CompanyName"
      Content="{Binding ElementName=CompanyName, Path=Name, Converter={ID:Static Controller:Translator.Instance}}" />

这个 ComboBox 改变了我的当前值 - 有效

 <ComboBox
        SelectedItem="{Binding Path=CurrentLanguage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={StaticResource FlagConverter}}">

后面的翻译代码 - 有效(PropertyChanged 被触发)

    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
    }

【问题讨论】:

  • 这很奇怪。您甚至没有将转换器用作转换器。您正在将元素绑定到自身?
  • @Sinatr 我会看看他们两个,谢谢 :) 这样但是没有内存泄漏 =)
  • @Blam 是的,我是,它工作得非常好,我只是设置了一个转换器来使用它的名称,然后我将它翻译成一个字符串,它可以在我的翻译 .XML 中找到,名称充当字典的键:)
  • 但是它不起作用,它对我来说仍然很奇怪。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • @Blam 我会尝试 MultiValueConverter 并会报告,这听起来很有希望 =)

标签: c# wpf xaml inotifypropertychanged ivalueconverter


【解决方案1】:

解决方案: 使用 MultiBinding + IMultiValueConverter

组合框保持不变。

编辑 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;
        }

谢谢很多人!

【讨论】:

    【解决方案2】:

    我看到了 2 个可能的解决方案:

    • 使用多值转换器并绑定到 Name AND CurrentLanguage
    • 更像是一个 hack:向 comboxbox.itemchanged 添加一个事件触发器并使用 Company.Name 重置 Company.Name 的值(调用 setter -> 调用转换器)

    【讨论】:

    • 我会先尝试第一种解决方案,因为其他人也提到过。我想到了第二个,但我想要一种更有效的方法来做到这一点,因为我不想使用成员来存储 XAML 可以自行管理的东西。此外,我的代码中有多个 ItemsControls,这会大大增加内存使用量(每个控件的标签 + 工具提示翻译)
    • 在阅读了一些关于它们的信息后,我发现:blog.csainty.com/2009/12/wpf-multibinding-and.html 看起来很有希望。这就是你没有从书本上学习 WPF,而是通过尝试失败学习方法得到的:D
    • MultiValueConverter 按预期工作,非常感谢! (由于尚未获得高声望,我的投票不起作用)
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多