c# - 两个属性 - 第二个属性类型取决于第一个属性

标签 c# wpf properties

我创建了一个包含两个变量的类:Type & Value .如果第一个属性 ( Type ) 已填充,则第二个属性 ( Value ) 只能包含与在 Type 上选择的类型相匹配的值属性(property)。

public class Requirement
{
    public RequirementType Type { get; set; }
    public object Value { get; set; }  

    public enum RequirementType
    {
        OS, NetFramework, Connection
    }             
    public enum OSType
    {
        // Used for RequirementType.OS
        Win, Unix, MacOSX
    }
    public enum NetFrameworkType
    {
        // Used for RequirementType.NetFramework
        Two, Three, Four, FourHalf
    }
    public enum ConnectionType
    {
        // Used for RequirementType.Connection
        Internet, Connected, None
    }  
}

我在 XAML 中使用这个类:

<util:Requirement Type="OS" Value="Win" />

例如,如果枚举值 OS已被选中。唯一有效的值应该来自枚举 OSType .我开始查看 .Net 源代码,他们是如何使用 System.Windows.Trigger 解决这个问题的& System.Windows.Setter但还没有成功..这似乎与DependsOn有关属性和 XamlSetTypeConverterAttribute .有人知道这个问题的解决方案吗?

最佳答案

您可以为值使用支持字段,并在设置时检查每种类型。

public class Requirement
{
    public RequirementType Type { get; set; }

    private object _value;
    public object Value 
    { 
        get { return _value; }
        set
        {
            if (Type == RequirementType.OS && 
                value.GetType() == typeof(OSType))
            {
                _value = value;
            }
            else 
            {
                throw new Exception("Value type is incorrect for Type provided");
            }
        }
    }  
}

这个测试会抛出异常:

var req = new Requirement();
req.Type = RequirementType.OS;
req.Value = RequirementType.Connection;

虽然第二次测试将正确设置值:

var req = new Requirement();
req.Type = RequirementType.OS;
req.Value = OSType.Win;

关于c# - 两个属性 - 第二个属性类型取决于第一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486146/

相关文章:

c# - 组合框默认值 winforms c#

c# - 从 XSD 创建类

c# - ScaleTransform 部分缩放 ContextMenu

wpf - ComboBox SelectedItem 初始值不是来自 ItemsSource

php - 常量表达式包含无效操作

c# - XAML Hub Control Windows 8.1 Universal,InvokeCommandAction 未触发

c# - 选择 namespace 名称时我应该知道什么?

python - IronPython WPF 与 RevitPythonShell

C# - 常量属性是否等同于 lambda 表达式?

c# - 对象初始值设定项中的属性可以相互引用吗?