【问题标题】:Show/hide button with BooleanToVisibilityConverter does not work带有 BooleanToVisibilityConverter 的显示/隐藏按钮不起作用
【发布时间】:2012-11-02 15:26:04
【问题描述】:

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

我尝试使用在我的资源字典中定义的 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 有问题还是我的依赖属性实现有问题?还是什么?

谢谢!

【问题讨论】:

  • 嗯 - 从来没有? ;) 也许这就是问题所在?
  • 是的,可能是这个问题:),在 ctor 中试试这个:this.DataContext = this
  • 嘿,谢谢!你太棒了 :) 这就是问题所在。现在我的代码有效。我想现在我明白了这个问题。找不到我的财产,因为没有指定在哪里搜索它 - 所以我想。
  • @kmatyaszek - 将其写为答案,Gery87 接受该答案(并可选择投票)。你们都得到积分,问题被标记为已关闭。每个人都赢了!

标签: c# .net wpf xaml dependency-properties


【解决方案1】:

你必须像这样设置DataContext:

this.DataContext = this;

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的详细解释。在接下来的几周里,我有很多关于依赖属性的工作 - 所以我相信我有时会想起你的提示;)
    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多