WPF MVVM NET 3.5:GridViewColumn条件绑定

时间:2017-07-29 01:15:08

标签: wpf xaml listview binding gridviewcolumn

我有一个listview,其中有一个gridview。我将其列定义如下,例如,对于员工类型列:

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

正如您所看到的那样,它与#34; EmployeeType&#34;视图模型中的属性。

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
  • 100℃

所以我想做的是:

  • 如果EmployeeType为1000A,我想在列#34;员工类型&#34;中显示字符串管理器
  • 如果EmployeeType为1000B,我想在列#34;员工类型&#34;中显示字符串工程师
  • 如果EmployeeType为1000C,我想在列#34;员工类型&#34;中显示字符串技术

另外,我不知道是否有可能在“&#34;经理&#34;,&#34;工程师&#34;,&#34;技术&#34;”栏目中显示,但在内部(未显示)分别链接到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>

因此在将列显示到列表视图时使用此转换器&#34;转换&#34;方法被调用,当从列表视图中读取所选项时,如果我需要读回此列的值,我如何使用ConvertBack方法读取?

另外,另一种可能性是在xaml视图中使用可能的触发器,并且当从listview中读取所选项时实现某些方法来执行相反的转换以恢复原始值。

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

0 个答案:

没有答案