WPF GUI使用Thread.CurrentPrincipal进行管理

时间:2009-11-06 12:57:15

标签: wpf security binding

您好我发现了这个问题

How to manipulate WPF GUI based on user roles

并将他的答案应用于我的项目。我正在实施相同的行为。

但事情是属性绑定不起作用。

我创建RoleToVisibilityConverter类并进行一些测试,调用convert

RoleToVisibilityConverter conv = new RoleToVisibilityConverter();  
conv.Convert((object)Thread.CurrentPrincipal,cbo_organismo.GetType(),(object)"editor",System.Globalization.CultureInfo.CurrentCulture);

这项工作找到了,然后我将资源添加到我的usercontrol

<UserControl.Resources>
<fundafe:RoleToVisibilityConverter x:Key="roleConverter"/>
</UserControl.Resources> 

并绑定到我的按钮控件

<Button Margin="0,0,0,0" Visibility="{Binding Source=Thread.CurrentPrincipal,  Path=CurrentPrincipal, Converter={StaticResource roleConverter}, ConverterParameter=editor}" VerticalAlignment="Center" HorizontalAlignment="Left"  Name="btn_Eliminar" Click="btn_Eliminar_Click" Width="Auto" Height="25" Background="Transparent" BorderBrush="Transparent">
                         <Image Name="img_eliminar" Width="48" Source="imagenes/borrar.png" Height="19" />
                    </Button>

运行我的应用程序后,该按钮仍然可见。

如果我正在对Visibility属性进行硬编码,则隐藏按钮

btn_Eliminar.Visibility=(Visibility)conv.Convert((object)Thread.CurrentPrincipal,cbo_organismo.GetType(),(object)"editor",System.Globalization.CultureInfo.CurrentCulture)

有什么建议吗?

注意: 我不能使用最后一种方法,因为在我的实际场景中,按钮是ListView的DataTemplate的一部分,即使使用TreeHelper捕获按钮,ListView也只会因为虚拟化而将更改应用于第一项

1 个答案:

答案 0 :(得分:2)

假设这是您的代码逐字,看起来Button上的绑定错误。你有这个:

{Binding Source=Thread.CurrentPrincipal,  Path=CurrentPrincipal, Converter={StaticResource roleConverter}, ConverterParameter=editor}

请注意,您已将Thread.CurrentPrincipal作为来源绑定,但您也将Path设置为CurrentPrincipal。这相当于Thread.CurrentPrincipal.CurrentPrincipal,显然无法绑定。

老实说,我很确定你需要在{x:Static}附近Thread.CurrentPrincipal。此外,这意味着您需要声明System.Threading的命名空间。假设您将命名空间定义为“systhreading”,因此最终绑定将是:

{Binding Source={x:Static systhreading:Thread.CurrentPrincipal},  Converter={StaticResource roleConverter}, ConverterParameter=editor}