2013-12-12 40 views
1

我有一个绑定到Employee对象的ObservableCollection的WPF ListView。我的XAML看起来像这样:掩盖WPF中列的内容ListView/GridView

<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位数字)。是否有捷径可寻?

回答

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视图)。

如果您确实在考虑这一点,那么请将您的模型/后端中的“实际”值保留为加密/保护,无论您认为哪种方式合适,并且只允许查看其属性中的屏蔽数据。这就意味着,即使有人使用类似snoop的应用程序,他们从DataContext获得的所有内容都将是“*”,而不是实际的秘密值。

+0

非常感谢解释和警告词:像Snoop这样的工具。 – user685869