【问题标题】:wpf dependency property enum collectionwpf依赖属性枚举集合
【发布时间】:2025-12-20 02:35:16
【问题描述】:

我有一个列出所有可能设置的枚举:

public enum Settings
{
  Settings1,
  Settings2,
  Settings3
}

在我的用户控件中,我想实现一个新的依赖属性,它包含一个设置列表并能够像这样使用它:

<my:Control Settings="Settings1, Settings2" />

我应该如何实现这个?

【问题讨论】:

  • 你的设置真的应该是一个枚举吗?它真的是一个具有枚举 [Flags] 属性的设置,还是它们具有不同功能的设置?

标签: wpf enums dependency-properties


【解决方案1】:

在您的 UserControl 中,使您的 Dependency 属性成为 Settings 的集合(也许将您的枚举重命名为 Setting),然后您可以在 XAML 中填充它:

<my:Control>
  <my:Control.Settings>
    <x:Static Member="my:Setting.Setting1" />
    <x:Static Member="my:Setting.Setting2" />
  </my:Control.Settings>
</my:Control>

我没有测试过这个:)

如果您想坚持使用逗号分隔的列表,则将您的 UserControl Settings DP 设为字符串,然后在属性更改事件处理程序上,拆分字符串并在每个结果上使用 Enum.Parse 将设置存储为您的 @ 987654325@枚举类型。

【讨论】:

    【解决方案2】:
    public class StringDelimitedToEnumListConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            List<Settings> retval = new List<Settings>();
            if(value == null || value.GetType() != typeof(string) || targetType != typeof(List<Settings>) )
            {
                throw new ArgumentException("value must be of type string, target type must be of type List<Settings>");
            }
            string workingValue = value.ToString();
            if (String.IsNullOrEmpty(workingValue))
            {
                throw new ArgumentException("value must not be an empty string");
            }
            if (workingValue.Contains(','))
            {
                string[] tokens = workingValue.Split(',');
                foreach (string s in tokens)
                {
                    retval.Add((Settings)Enum.Parse(typeof(Settings), s));
                }
                return retval;
            }
            else
            {
                //there was only 1 value
                retval.Add((Settings)Enum.Parse(typeof(Settings),workingValue);
                return retval;
            }
    
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //do we care?
            throw new NotImplementedException();
        }
    }
    

    【讨论】:

    • 我已经改用 ChangedCallBack 但你的回答仍然足够好:)