C# 带有BooleanToVisibilityConverter的显示/隐藏按钮不工作

C# 带有BooleanToVisibilityConverter的显示/隐藏按钮不工作,c#,.net,wpf,xaml,dependency-properties,C#,.net,Wpf,Xaml,Dependency Properties,在我的应用程序中,我想根据用户授权级别显示/隐藏一个按钮。 如果用户是团队领导,则应显示按钮。如果用户不是团队负责人,则不应显示 我尝试使用我的资源字典中定义的BooleantVisibilityConverter解决此问题: 在用户控件的“已加载事件”中,我使用false初始化属性,因此按钮应该折叠 private void ViewPage_Loaded(object sender, RoutedEventArgs e) { this.IsTeamLeader = false; }

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

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

在用户控件的“已加载事件”中,我使用
false
初始化属性,因此按钮应该折叠

private void ViewPage_Loaded(object sender, RoutedEventArgs e)
{
   this.IsTeamLeader = false;
}
但这行不通。无论
isteamreader
属性在启动时具有哪个值,按钮始终可见

那么,你能帮我个忙,给我一个提示,我在哪里犯了错误吗?
BooleanToVisiblityConverter是否有问题,或者我的依赖项属性实现是否有问题?还是什么

谢谢大家!

从阅读评论中可以看出,您尚未设置datacontext.:-)

但要在将来调试此问题,您应该从调试器中的已知信息返回。让我解释一下

  • 在转换器中放置断点。如果未调用,则绑定在源位置失败;比如你发现了什么。如果它正在工作,(并且返回值合适),则转到#2
  • 使Dependency属性具有已更改的处理程序,并在其中放置断点,例如:

        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;
        }
    
    public bool MyBoolProperty
    {
    获取{return(bool)GetValue(MyBoolPropertyProperty);}
    set{SetValue(MyBoolPropertyProperty,value);}
    }
    /// 
    ///标识MyBoolProperty依赖项属性。
    /// 
    公共静态只读从属属性MyBoolPropertyProperty=
    从属属性。寄存器(
    “MyBoolProperty”,
    类型(bool),
    类型(MyClass),
    新的PropertyMetadata(false,OnMyBoolPropertyPropertyChanged));
    /// 
    ///MyBoolPropertyProperty属性已更改处理程序。
    /// 
    ///更改其MyBoolProperty的MyClass。
    ///事件参数。
    MyBoolPropertyPropertyChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
    {
    MyClass source=d作为MyClass;//此处为断点。。。
    bool值=(bool)e.NewValue;
    }
    
  • 如果事件从未被触发…则进入依赖关系的数据与预期的类型之间存在类型不匹配


    上面的示例使用了一个值类型,并且该值类型很难不匹配,因此可能不是这样……但有时您在源位置将数据作为接口,并且依赖项属性无法将接口转换为其预期的目标对象。

    您必须像这样设置
    DataContext

    this.DataContext = this;
    

    嗯-从来没有也许这就是问题所在?是的,可能这就是问题:),在ctor中试试这个:
    this.DataContext=this
    嘿,伙计,谢谢!你真可怕:)这就是问题所在。现在我的代码工作了。我想现在我明白了问题所在。找不到我的属性,因为没有指定在何处搜索它—我想是这样。@kmatyaszek—将它写为答案,Gery87接受该答案(并有选择地投票)。你们都得到了分数,问题被标记为结束。人人都赢!谢谢你的详细解释。在接下来的几周里,我有很多工作要处理依赖关系属性——因此我相信有时我会想起你的提示;)
    private void ViewPage_Loaded(object sender, RoutedEventArgs e)
    {
       this.IsTeamLeader = false;
    }
    
        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;
        }
    
    this.DataContext = this;