3

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

我看到了几个挑战:

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

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

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

欢迎任何想法。

大卫

4

2 回答 2

3

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

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

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

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

<!-- 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>

另一种选择是制作一个具有资源键的单一样式,然后从每个控件中引用它,这也很麻烦,但是如果您在设计时知道所有控件,则可以使用 Blend 相对容易地完成(您将选择所有控件,然后使用属性窗口应用样式)。

希望这会帮助你。

于 2013-04-26T17:14:31.063 回答
-1

使用 xaml 文件中的属性 IsHitTestVisible 使真正的只读

<Grid IsHitTestVisible = "False">
//put a control
</Grid>
于 2016-01-12T15:52:38.127 回答