在我的应用程序中,我想根据用户授权级别显示/隐藏按钮。 如果用户是团队负责人,则应显示按钮。如果用户不是团队领导者,则不应显示。
我尝试使用我的资源字典中定义的BooleanToVisibilityConverter
来解决此问题:
<BooleanToVisibilityConverter x:Key="VisibilityConverter" />
转换器的实现:
<Button Grid.Row="1" Grid.Column="5"
Click="TeamLeader_Click" Visibility="{Binding IsTeamLeader, Converter={StaticResource
VisibilityConverter}}" Style="{StaticResource ButtonStyleMenu}" />
在我后面的代码中,我使用依赖属性来改变按钮的可见性。
public static readonly DependencyProperty IsTeamLeaderProperty =
DependencyProperty.Register("IsTeamLeader", typeof(bool),
typeof(MainMenu), new FrameworkPropertyMetadata(false));
public bool IsTeamLeader
{
get { return (bool)GetValue(IsTeamLeaderProperty); }
set { SetValue(IsTeamLeaderProperty, value); }
}
在我的用户控件的“加载事件”中,我使用false
初始化我的属性,因此按钮应该折叠。
private void ViewPage_Loaded(object sender, RoutedEventArgs e)
{
this.IsTeamLeader = false;
}
但这不起作用。无论IsTeamLeader
属性在启动时具有哪个值,该按钮始终可见。
那么请你帮我一下,给我一个暗示我犯错误的地方?是BooleanToVisiblityConverter
有问题还是我的依赖属性实现有问题?或者是什么?
谢谢!
答案 0 :(得分:2)
您必须像这样设置DataContext
:
this.DataContext = this;
答案 1 :(得分:0)
您(未阅读评论)显示您尚未设置datacontext。 : - )
但是为了将来调试这个问题,你应该从调试器中的知识中恢复过来。让我解释一下
使dependancy属性具有更改的处理程序并在其中放置断点,例如:
public bool MyBoolProperty
{
get { return (bool)GetValue(MyBoolPropertyProperty); }
set { SetValue(MyBoolPropertyProperty, value); }
}
/// <summary>
/// Identifies the MyBoolProperty dependency property.
/// </summary>
public static readonly DependencyProperty MyBoolPropertyProperty =
DependencyProperty.Register(
"MyBoolProperty",
typeof(bool),
typeof(MyClass),
new PropertyMetadata(false, OnMyBoolPropertyPropertyChanged));
/// <summary>
/// MyBoolPropertyProperty property changed handler.
/// </summary>
/// <param name="d">MyClass that changed its MyBoolProperty.</param>
/// <param name="e">Event arguments.</param>
private static void OnMyBoolPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyClass source = d as MyClass; // Breakpoint here...
bool value = (bool)e.NewValue;
}
如果事件永远不会被触发......进入依赖项的数据与您期望的类型之间的类型不匹配。
上面的示例使用了一个值类型,并且很难不匹配,因此可能不是这种情况......但有时您在源处将数据作为接口,并且依赖项属性无法将接口转换为其目标对象就是它所期望的。