WPF - Toggle Panel into an Edit Mode, but exludes specific parts using Styles 将WPF中的面板切换为编辑模式,但使用样式排除特定部分

15 浏览
0 Comments

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\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n预期发生的事情:\n首先,ViewModel的IsEnabled属性设置为\'true\'->因此,所有控件应该是可编辑的。但是,Stackpanel下的控件(仅为文本框)不应该是可编辑的,并且具有红色背景,因为附加属性在它们所属的Stackpanel中设置为false。\n实际发生的情况:\n触发器在Stackpanel下的控件上不起作用,它们是可编辑的。\n我认为发生的事情:\n样式为每个文本框重新声明属性,这与它们从Stackpanel继承的属性不同。因此,根据样式,控件应该是可用的。\n我能否调整样式中的触发器,使其首先查找继承的属性,然后查找我基于视图模型的IsEnabled属性声明的默认值?\n也许还有其他我没有看到的方法吗?

0
0 Comments

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内,但导致了堆栈溢出的错误。

0