WPF - Toggle Panel into an Edit Mode, but exludes specific parts using Styles 将WPF中的面板切换为编辑模式,但使用样式排除特定部分
WPF - Toggle Panel into an Edit Mode, but exludes specific parts using Styles 将WPF中的面板切换为编辑模式,但使用样式排除特定部分
我在我的应用程序中使用了许多不同部分的面板。当按下按钮时,我希望将面板/画布/用户控件的某些部分设置为编辑模式,同时根据我创建的附加属性,可以排除其他部分。在我的ViewModel中,我使用一个布尔属性\"IsEnabled\",在其中绑定了一个全局样式(在此示例中为在资源字典中定义的文本框)。如下所示:\n\n附加属性定义如下:\nstatic Properties()\n {\n EditableProperty = DependencyProperty.RegisterAttached(\"Editable\", typeof(bool), typeof(EasyProperties), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));\n }\n public static readonly DependencyProperty EditableProperty; \n public static void SetEditable(DependencyObject dependencyObject, bool value)\n {\n dependencyObject.SetValue(EditableProperty, value);\n }\n public static bool GetEditable(DependencyObject dependencyObject)\n {\n return (bool)dependencyObject.GetValue(EditableProperty);\n }\n示例XAML如下,我希望通过将容器中的Editable属性设置为false来排除Stackpanel下的UserControl的一部分:\n
WPF - Toggle Panel into an Edit Mode, but excludes specific parts using Styles
最近经过一些研究和测试(特别感谢指点我正确方向的人),我找到了一个答案:使用附加属性上的MultiDataTrigger,结合使用枚举而不是布尔值作为附加属性。
首先,我创建了一个枚举类型EnabledEnum:
public enum EnabledEnum { NotSet, False, True }
然后,我将附加属性的类型改为typeof(EnabledEnum),并将其初始化为NotSet:
static Properties() { EditableProperty = DependencyProperty.RegisterAttached("Editable", typeof(EnabledEnum), typeof(EasyProperties), new FrameworkPropertyMetadata(EnabledEnum.NotSet, FrameworkPropertyMetadataOptions.Inherits)); } public static readonly DependencyProperty EditableProperty; public static void SetEditable(DependencyObject dependencyObject, EnabledEnum value) { dependencyObject.SetValue(EditableProperty, value); } public static EnabledEnum GetEditable(DependencyObject dependencyObject) { return (EnabledEnum)dependencyObject.GetValue(EditableProperty); }
接下来是样式的修改部分:
这样修改后的样式可以按照预期工作。唯一令我不满意的是样式内的重复代码。我尝试将"Properties:Properties.Editable"设置在Multidatatrigger内,但导致了堆栈溢出的错误。