屏蔽WPF ListView / GridView中列的内容

时间:2013-12-12 12:51:22

标签: c# wpf listview gridview

我有一个绑定到Employee对象的ObservableCollection的WPF ListView。我的XAML看起来像这样:

<ListView x:Name="myListView" ItemsSource="{Binding Employees}">
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridViewColumn DisplayMemberBinding="{Binding EmployeeName}" Width="175">
                <GridViewColumnHeader Content="EmployeeName"/>
            </GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding EmployeeID}" Width="125">
                <GridViewColumnHeader Content="EmployeeID"/>
            </GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding EmployeeSecretCode}" Width="125">
                <GridViewColumnHeader Content="EmployeeSecretCode"/>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

我需要显示EmployeeSecretCode列,但我想完全或部分地屏蔽它的内容。因此,我不想显示实际代码(比如说12345),而是要显示*****(因为12345是5位数)或者********(因为代码的最大大小是8)位)。有一个简单的方法吗?

1 个答案:

答案 0 :(得分:2)

使用IValueConverter

实现此要求的简单示例
internal class MyConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    var input = value.ToString();
    // change "input.Length" in the following line to 8 if you just want 8 "*" regardless of length
    return new String('*', input.Length);
  }

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

和xaml:

<ListView x:Name="myListView"
          ItemsSource="{Binding Employees}">
  <ListView.Resources>
    <local:MyConverter x:Key="MyConverter" />
  </ListView.Resources>
  ...
      <GridViewColumn Width="125"
                      DisplayMemberBinding="{Binding EmployeeSecretCode,
                                                      Converter={StaticResource MyConverter}}">
        <GridViewColumnHeader Content="EmployeeSecretCode" />
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

注意:

请考虑UI中此类实现的安全含义。使用像Snoop之类的应用程序可以轻松获得DataContext,从而获得您在此处屏蔽的实际值。因此,这仅仅是一个UI掩码,并没有提供任何可行的安全性(实际上它添加了一个弱链接,因为不安全的值暴露给UI视图)。

如果这是您确实在考虑的事情,那么请以您认为合适的方式保持模型/后端中的“实际”值加密/保护,并仅在其属性中为View提供屏蔽数据。这就意味着,即使有人使用像app这样的窥探,他们从DataContext获得的只是“*”而不是真正的秘密值。