首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XAML在整个容器(如Panel或IsEnabled )上设置IsEnabled/IsEnabled?

如何使用XAML在整个容器(如Panel或IsEnabled )上设置IsEnabled/IsEnabled?
EN

Stack Overflow用户
提问于 2012-04-07 02:28:14
回答 2查看 11.7K关注 0票数 4

我有一个MVVM应用程序,它包含基于用户权限、视图/编辑模式和对象状态的一些复杂的IsReadOnly规则的多个视图。

我想为同一容器中的整个控件组设置IsReadOnly和/或IsEnabled属性(GroupBox / StackPanel / Grid / UserControl /等)。此属性的值将在ViewModel中定义。

我为每个UserControl提供了3-6个不同的SomeGroupIsReadOnly属性(有大量的输入控件,如TextBoxRadioButtonsComboBoxes和一些DataGrids),我正在寻找一个通用的MVVM-friendly解决方案,它将允许我在每个容器的基础上重用绑定,而不是为每个单独的控件分别指定它们。

如何使用XAML?在容器内的所有控件(如Panel或GroupBox )上设置IsReadOnly / IsEnabled

似乎WPF不支持这一点.

编辑

我忘记提到为容器设置IsEnabled会禁用TextBoxes的一个重要特性--能够复制它们的内容。我需要他们进入IsReadOnly=true状态。如果有工作的话,我的问题就会解决。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-07 04:38:05

对于我们来说,一些很好的方法是定义一个表示应用程序权限结构的视图模型(在下面的示例中是YourPermissionsViewModel)。

然后,您可以创建一个自定义面板控件,该控件扩展您选择的任何面板(本例中为StackPanel)。通过这种方式,您可以添加IsReadOnly属性绑定并将它们保存到面板的子组件中。

以下是XAML中的面板可能是什么样子:

代码语言:javascript
复制
<local:PanelExtension IsEnabled="{Binding YourPermissionsViewModel.IsEnabled}" 
                      IsReadOnly="{Binding YourPermissionsViewModel.IsReadOnly}">
    <TextBox Text="eeny" Width="100" />
    <TextBox Text="meeny" Width="100"/>
    <TextBox Text="miny" Width="100"/>
    <TextBox Text="mo" Width="100" />
    <Label Content="coolio" Width="100" />
</local:PanelExtension>

下面是包含所有StackPanel特性的StackPanel扩展控件,以及附加一个自定义IsReadOnly依赖项属性,该属性更新所有拥有该属性的子控件的相应属性值:

代码语言:javascript
复制
public class PanelExtension : StackPanel
{
    public bool IsReadOnly
    {
        get { return (bool)GetValue(IsReadOnlyProperty); }
        set { SetValue(IsReadOnlyProperty, value); }
    }
    public static readonly DependencyProperty IsReadOnlyProperty =
        DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(PanelExtension),
        new PropertyMetadata(new PropertyChangedCallback(OnIsReadOnlyChanged)));

    private static void OnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((PanelExtension)d).OnIsReadOnlyChanged(e);
    }

    protected virtual void OnIsReadOnlyChanged(DependencyPropertyChangedEventArgs e)
    {
        this.SetIsEnabledOfChildren();
    }

    public PanelExtension()
    {
        this.Loaded += new RoutedEventHandler(PanelExtension_Loaded);
    }

    void PanelExtension_Loaded(object sender, RoutedEventArgs e)
    {
        this.SetIsEnabledOfChildren();
    }

    private void SetIsEnabledOfChildren()
    {
        foreach (UIElement child in this.Children)
        {
            var readOnlyProperty = child.GetType().GetProperties().Where(prop => prop.Name.Equals("IsReadOnly")).FirstOrDefault();
            readOnlyProperty.SetValue(child, this.IsReadOnly, null);
        }
    }
}

使用这种方法,您可以添加您需要的许多自定义属性,它确实为您提供了很大的灵活性,并使您能够考虑当您必须对各种元素设置复杂权限时可能遇到的多种场景。

票数 7
EN

Stack Overflow用户

发布于 2012-04-07 03:55:11

禁用包含控件的面板也将禁用面板中的控件。将小组的IsEnabled成员绑定到ViewModel上的bool属性,并根据您的规则设置它以禁用该面板及其所有子级。

Xaml:

代码语言:javascript
复制
<GroupBox IsEnabled="{Binding Path=IsGroupEnabled}">
    <StackPanel>
        <Button Content="Sample Button"/>
        <TextBox Text="Sample text box"/>
    </StackPanel>
</GroupBox>
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10051226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档