【问题标题】:WPF - Set child controls of a user control to be readonly using bindingWPF - 使用绑定将用户控件的子控件设置为只读
【发布时间】:2013-04-26 08:38:21
【问题描述】:

我有一个带有许多不同控件的 WPF 应用程序。我需要能够根据我想要绑定到的视图模型中的属性将所有子控件设置为只读。

我看到了几个挑战:

  1. 如何确保将父控件设置为只读,同时设置子控件
  2. 并非所有控件都有 ReadOnly 属性 - 有些是 IsReadOnly,有些只有 IsEnabled

有没有人对通用解决方案有任何看法,而不是我必须为每个单独的控件绑定适当的属性(ReadOnly、IsReadOnly 等)?

有什么方法可以使用附加属性吗?无论如何,例如,我可以在网格上设置一个属性,然后在代码中遍历每个子控件设置它的适当属性(如果适用的话)?

欢迎任何想法。

大卫

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

    我建议使用 WPF 隐式样式来执行此操作。该样式将包含与视图模型的绑定,例如:

    <Style TargetType="{x:Type Button}">
        <Setter Property="IsEnabled" Value="{Binding IsNotProcessing}" />
    </Style>
    

    由于此样式没有设置x:Key 属性并在TargetType 属性上使用x:Type 标记扩展,因此在这种情况下它隐式应用于所有按钮。

    您必须为视图中的每个不同控件编写一个隐式样式,因为以下样式不会应用于您的所有按钮、文本框和您使用的任何控件(尽管IsEnabled 属性是在@987654326 上定义的@):

    <!-- This implicit style is not applied as the x:Type must be the same type as 
         the targeted control; inheritance does not work here. -->
    <Style TargetType="{x:Type FrameworkElement}">
        <Setter Property="IsEnabled" Value="{Binding IsNotProcessing}" />
    </Style>
    

    另一种选择是创建一个具有资源键的单一样式,然后从每个控件中引用它,这也很麻烦,但如果您在设计时了解所有控件(您将选择所有控件,然后使用属性窗口应用样式)。

    希望这会对你有所帮助。

    【讨论】:

    • 谢谢,我会在我的场景中解决这个问题......也许我试图让事情变得比他们需要的更复杂
    【解决方案2】:

    使用 xaml 文件中的 IsHitTestVisible 属性设置为只读

    <Grid IsHitTestVisible = "False">
    //put a control
    </Grid>
    

    【讨论】:

    • 不,不要那样做。当 IsHitTestVisible 设置为 False(例如使用 Tab)时,这些控件仍然可以访问。
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2013-08-29
    • 2012-04-15
    相关资源
    最近更新 更多