简体   繁体   中英

WPF Treeview use property value as Binding Path

I'm trying to create a Treeview using an ObservableCollection of a custom class called MachineComponentFault, which includes a string property called FaultText, and I'd like to make the text localized.

I'm using WPF Runtime Localization from Codeproject to localize texts at runtime, and it usually works as follows:

<TextBlock Text="{Binding Path=NameInResources, Source={StaticResource Resources}}"/>

The problem is that I can't seem to figure out how to set the value of the property to the path, so that it can retrieve the translation. This is what I managed thus far:

  <TreeView Name="myTreeView" VirtualizingPanel.IsVirtualizing="True" ItemsSource="{Binding Faults}">
    <TreeView.Resources>
      <DataTemplate DataType="{x:Type MassComponents:MachineComponentFault}">
        <StackPanel Orientation="Horizontal" >
          <TextBlock Name="Text1" Text="{Binding FaultText}"/>
          <TextBlock Name="Text2" Text="{Binding Path=FLT_PTC_1, Source={StaticResource Resources}}"/>
        </StackPanel>
      </DataTemplate>
    </TreeView.Resources>
  </TreeView>

Essentially Text1 shows FLT_PTC_1 at Runtime, while Text2 shows "Motor Overheat", which is the value of FLT_PTC_1 in Resources.resx (which can be translated). The issue is that I can't seem to be able to do what Text2 does using FaultText Property.

Is there a way to do it?

EDIT:

Solved it using mm8 solution, while maintaining the WPF Runtime Localization. The solution isn't pretty at all, since it consists in creating a Binding on a dummy class and then retrieving the binding value as a string, which seems a bit convoluted, but it's the best solution I could find.

  public class ResourceConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      string resourceName = value as string;

      if (!string.IsNullOrEmpty(resourceName)) //look up the resource here:
      {
        Binding b = new Binding(resourceName); //Create Binding using as Path the value of FaultText
        b.Source = CultureResources.ResourceProvider; //Get the resources from WPF Runtime Localization ObjectDataProvider
        BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, b); //Set the Binding to the dummy class instance
        return _dummy.GetValue(Dummy.ValueProperty); //Retrieve the value of the Binding from the dummy class instance and return it
      }

      return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }

    //Initialize Dummy class
    private static readonly Dummy _dummy = new Dummy();

    //Create a dummy class that accepts the Binding
    private class Dummy : DependencyObject
    {
      public static readonly DependencyProperty ValueProperty =
          DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null));
    }
  }

XAML same as mm8 proposed.

You could bind to the FaultText property and use a converter to look up the resource. Something like this:

public class ResourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string resourceName = value as string;
        if (!string.IsNullOrEmpty(resourceName)) //look up the resource here:
            return Resource1.ResourceManager.GetString(resourceName);

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

<TextBlock Name="Text2">
    <TextBlock.Text>
        <Binding Path="FaultText">
            <Binding.Converter>
                <local:ResourceConverter />
            </Binding.Converter>
        </Binding>
    </TextBlock.Text>
</TextBlock>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM