【问题标题】:Set Visibility of a control with custom class使用自定义类设置控件的可见性
【发布时间】:2011-09-15 07:16:51
【问题描述】:
<TextBlock.Visibility>
    <mat:MatcherConverter>
        <mat:Matcher MatchVisibility="Visible" DismatchVisibility="Collapsed">
            <mat:Matcher Value1="{Binding Boolean1}" Value2="True" ComparisonOperator="AND"/>
            <mat:Matcher Value1="{Binding Boolean2}" Value2="True" ComparisonOperator="AND"/>
        </mat:Matcher>
    </mat:MatcherConverter>
</TextBlock.Visibility>

您如何看待以 MarkupExtension 作为基类的类? 在这种情况下,它将是 MatcherConverter。这个类会递归地遍历所有匹配器,结果是一个布尔值。

【问题讨论】:

  • 您能否重新表述一下您的目标是什么?你说的对我来说毫无意义。
  • 这是非常模糊的。究竟是什么问题?您尝试了哪些方法,但如何未能达到/符合您的期望?
  • 我不知道,如何将 转换为可见性。使用 MarkupExtension 是一种合理的方法,然后我可以在 ProvideValue 方法中转换它。
  • 您是否正在尝试实现分层数据表示(如嵌套树视图)? Web 上充满了如何在 WPF 中表示层次结构数据的示例...dev102.blogspot.com/2007/12/…

标签: c# wpf xaml


【解决方案1】:

您可以在Matcher 中创建一个属性TheBooleanResult,而不是返回您要评估的布尔结果(在Children 和Value1、Value2 上,...)。然后创建一个 IValueConverter 接受 Matcher 并获取 TheBooleanResult 并返回您想要的可见性。

public class MatcherConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Matcher m = (Matcher)value;
        return m.TheBooleanResult ? Visibility.Visible : Visibility.Hidden;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • @kusi581 我看到了你对这个问题的评论。您可以将Matcher 放在用户控件资源中(可能是ObjectDataProvider)。然后将文本框的可见性属性绑定到该资源。 Example with ObjectDataProvider
  • 可以说我想要基于 2 个不同条件的可见性(例如:用户权限、全局权限)。现在,我将一个匹配器添加到可见性中,并将其他 2 个匹配器作为子级。根匹配器的 ComparisionOperator 是 AND,当两个子匹配器都为真时,它的 Visible,否则折叠。子项的 Value1 绑定到模型上的属性。所以匹配器的组合总是不同的
  • 你可以把它放在文本框的资源中,但你似乎在寻找别的东西..
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多