[英]Masking the contents of a column in a WPF ListView / GridView
我有一个WPF ListView绑定到Employee对象的ObservableCollection。 我的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位数字)。 是否有捷径可寻?
一个使用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视图中,则会增加一个弱链接cos)。
如果确实要考虑这一点,则以您认为合适的任何方式对“模型/后端”中的“实际”值进行加密/保护,并仅在其属性中赋予“查看”蒙版数据。 这将意味着,即使有人使用类似snoop的应用程序,从DataContext获得的所有内容都是“ *”,而不是实际的秘密值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.