Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:如果转换器的属性发生更改,有没有办法强制转换器更新?_C#_Wpf_Xaml_Inotifypropertychanged_Ivalueconverter - Fatal编程技术网

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