2

在我的应用程序中,我想根据用户授权级别显示/隐藏一个按钮。如果用户是团队负责人,则应显示该按钮。如果用户不是团队负责人,则不应显示。

我尝试使用BooleanToVisibilityConverter资源字典中定义的 a 来解决此问题:

<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还是有问题?要不然是啥?

谢谢!

4

2 回答 2

2

你必须DataContext像这样设置:

this.DataContext = this;
于 2012-11-02T20:31:10.103 回答
0

看来(通过阅读评论)您尚未设置数据上下文。:-)

但是要在将来调试此问题,您应该从调试器中的已知情况返回。让我解释

  1. 在转换器中放置一个断点。如果没有被调用,则绑定在源头失败;比如你发现的。如果它正在工作,(并且返回值是适当的)然后转到#2。
  2. 使依赖属性具有更改的处理程序并在其中放置一个断点,例如:

        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;
        }
    

如果事件永远不会被触发......您在进入依赖关系的数据与您期望的类型之间存在类型不匹配。

上面的示例使用了一个值类型,并且该值类型很难不匹配,因此情况可能并非如此......但有时您将数据作为源接口,并且依赖属性无法将接口转换为其目标对象,即它期望什么。

于 2012-11-02T18:26:42.210 回答