我有一个MVVM应用程序,它包含基于用户权限、视图/编辑模式和对象状态的一些复杂的IsReadOnly规则的多个视图。
我想为同一容器中的整个控件组设置IsReadOnly和/或IsEnabled属性(GroupBox / StackPanel / Grid / UserControl /等)。此属性的值将在ViewModel中定义。
我为每个UserControl提供了3-6个不同的SomeGroupIsReadOnly属性(有大量的输入控件,如TextBox、RadioButtons、ComboBoxes和一些DataGrids),我正在寻找一个通用的MVVM-friendly解决方案,它将允许我在每个容器的基础上重用绑定,而不是为每个单独的控件分别指定它们。
如何使用XAML?在容器内的所有控件(如Panel或GroupBox )上设置IsReadOnly / IsEnabled
似乎WPF不支持这一点.
编辑
我忘记提到为容器设置IsEnabled会禁用TextBoxes的一个重要特性--能够复制它们的内容。我需要他们进入IsReadOnly=true状态。如果有工作的话,我的问题就会解决。
发布于 2012-04-07 04:38:05
对于我们来说,一些很好的方法是定义一个表示应用程序权限结构的视图模型(在下面的示例中是YourPermissionsViewModel)。
然后,您可以创建一个自定义面板控件,该控件扩展您选择的任何面板(本例中为StackPanel)。通过这种方式,您可以添加IsReadOnly属性绑定并将它们保存到面板的子组件中。
以下是XAML中的面板可能是什么样子:
<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依赖项属性,该属性更新所有拥有该属性的子控件的相应属性值:
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);
}
}
}使用这种方法,您可以添加您需要的许多自定义属性,它确实为您提供了很大的灵活性,并使您能够考虑当您必须对各种元素设置复杂权限时可能遇到的多种场景。
发布于 2012-04-07 03:55:11
禁用包含控件的面板也将禁用面板中的控件。将小组的IsEnabled成员绑定到ViewModel上的bool属性,并根据您的规则设置它以禁用该面板及其所有子级。
Xaml:
<GroupBox IsEnabled="{Binding Path=IsGroupEnabled}">
<StackPanel>
<Button Content="Sample Button"/>
<TextBox Text="Sample text box"/>
</StackPanel>
</GroupBox>https://stackoverflow.com/questions/10051226
复制相似问题