我有一个绑定到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)位)。有一个简单的方法吗?
答案 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获得的只是“*”而不是真正的秘密值。