0

我有一个列表视图,其中有一个网格视图。我将其列定义如下,例如对于员工类型列:

<GridViewColumn Header="Employee Type" Width="80" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock TextAlignment="Left" Text="{Binding EmployeeType}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

如您所见,它绑定到视图模型中的“EmployeeType”属性。

private string _employeeType;
public string EmployeeType
{
     get
     {
         return this._employeeType;
     }

     set
     {
         if (this._employeeType == value)
             return;

         this._employeeType = value;
         OnPropertyChanged("EmployeeType");
     }
}

EmployeeType 可以有以下可能性(它们是字符串 id):

  • 1000A
  • 1000B
  • 1000℃

所以我想做的是:

  • 如果 EmployeeType 是 1000A 我想在“Employee Type”列中显示字符串 Manager
  • 如果 EmployeeType 是 1000B 我想在“Employee Type”列中显示字符串 Engineer
  • 如果 EmployeeType 是 1000C,我想在“Employee Type”列中显示字符串 Technical

另外,我不知道是否有可能显示在“经理”、“工程师”、“技术”列中,但内部(未显示)分别链接到 1000A、1000B、1000C,所以当我需要阅读从列表视图中选择的项目,我需要读取 1000A、1000B、1000C 而不是显示的字符串,类似于 winforms 中的组合框,您显示一个成员,但该成员与未显示的值相关联,您可以阅读。

我怎样才能做到这一点?

也许使用如下转换器:

namespace Test.Converter
{

  public class MyConverter : IValueConverter
  {
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Do the conversion from string to visibility
        if (value == "1000A")
          return "Manager";
        else if (value == "1000B")
          return "Engineer";
        else if (value == "1000C")
          return "Technical";
        else
          throw new Exception(string.Format("Cannot convert, unknown value {0}", value));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Do the conversion from visibility to string
         string s = (string) value;
         if (s.Equals("Manager", StringComparison.InvariantCultureIgnoreCase))
           return "1000A";
         else if (s.Equals("Engineer", StringComparison.InvariantCultureIgnoreCase))
           return "1000B";
         else if (s.Equals("Technical", StringComparison.InvariantCultureIgnoreCase))
           return "1000C";
         else
           throw new Exception(string.Format("Cannot convert, unknown value {0}", value));
    }
  }
}

另外,在哪里放置这个转换器?在视图模型中?

查看

xmlns:l="clr-namespace:Test.Converter"

<Window.Resources>
    <l:MyConverter x:Key="converter" />
</Window.Resources>

<GridViewColumn Header="Employee Type" Width="80" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock TextAlignment="Left" Text="{Binding EmployeeType, Converter={StaticResource converter}}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

因此,在将列显示到列表视图时使用此转换器会调用“转换”方法,并且在从列表视图中读取选定项目时,如果我需要读回该列的值,如何使用 ConvertBack 方法读取?

此外,另一种可能性是在 xaml 视图中使用触发器,并在从列表视图中读取选定项目以实现某种方法进行相反的转换以恢复原始值时。

你有什么建议?请注意,此列是只读的(显示但不可修改),不能修改。

4

0 回答 0