【问题标题】:String array as comma separated string in XAML字符串数组作为 XAML 中的逗号分隔字符串
【发布时间】:2011-12-07 10:36:04
【问题描述】:

如何在 xaml 中设置 string[] 属性的值?

我控制下一个属性:string[] PropName

我想用下一种方式设置这个属性的值:

<ns:SomeControl PropName="Val1,Val2" />

【问题讨论】:

    标签: .net wpf xaml


    【解决方案1】:

    你可以使用the &lt;x:Array&gt; markup extension,但它的语法相当冗长。

    另一种选择是创建您自己的TypeConverter,它可以将逗号分隔的列表转换为数组:

    class ArrayTypeConverter : TypeConverter
    {
        public override object ConvertFrom(
            ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string list = value as string;
            if (list != null)
                return list.Split(',');
    
            return base.ConvertFrom(context, culture, value);
        }
    
        public override bool CanConvertFrom(
            ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
                return true;
    
            return base.CanConvertFrom(context, sourceType);
        }
    }
    

    如果您要转换的类型是您的类型,那么您可以将the [TypeConverter] attribute 应用于该类型。但既然你想转换成string[],你就不能这样做。因此,您必须将该属性应用于要使用此转换器的所有属性:

    [TypeConverter(typeof(ArrayTypeConverter))]
    public string[] PropName { get; set; }
    

    【讨论】:

      【解决方案2】:
           <ns:SomeControl>
              <SomeControl.PropName>
                  <x:Array Type="sys:String">
                      <sys:String>Val1</sys:String>
                      <sys:String>Val2</sys:String>
                  </x:Array> 
              </SomeControl.PropName>
          </ns:SomeControl>
      

      【讨论】:

      • +1。我刚刚意识到,在我写我的之前,您以 sll 的 cmets 方式提出了这个答案。
      【解决方案3】:

      想法是在控件/窗口的资源中将自定义值定义为数组,然后只使用绑定到静态资源:

      <!-- or Window.Resources -->
      <UserControl.Resources>
          <x:Array x:Key="CustomValues" 
                   Type="sys:String"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
              <sys:String>Val1</sys:String> 
              <sys:String>Val2</sys:String> 
          </x:Array> 
      </UserControl.Resources>
      
      <!-- Then just bind -->
      <ns:SomeControl PropName="{Binding Source={StaticResource CustomValues}}" />
      

      【讨论】:

      • 为什么绑定到StaticResource?为什么要资源?
      • +1,这是获取编译时已知值的方法。现在,如果他需要动态值(运行时值、绑定等),他将需要一个返回数组的 I(Multi)ValueConverter。
      • @Snowbear :这就是我现在所知道的,我会很感激任何更高级的解决方案,为什么你删除了你的答案并且没有提供答案?真的我不知道该怎么做
      • @sll,我删除了我的答案,因为由于某种未知原因,它的格式很奇怪,现在试图弄清楚
      • 编译时我知道所有的值,所以不需要绑定任何动态值。
      【解决方案4】:

      sll's answer 很好,但是如果你愿意,你可以避免使用资源并将值直接写入控件:

      <ns:SomeControl>
          <ns:SomeControl.PropName>
              <x:Array Type="sys:String" 
                       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                       xmlns:sys="clr-namespace:System;assembly=mscorlib">  
                  <sys:String>Val1</sys:String>  
                  <sys:String>Val2</sys:String>  
              </x:Array>  
          </ns:SomeControl.PropName>
      </ns:SomeControl> 
      

      此外,您可以将xmlns: 声明移动到头元素(Window、UserControl 等)中,这样您的控件属性就不会被它弄乱。

      PS:如果你是开发 SomeControl 的人,我会使用 svick's approach 并提供一个 TypeConverter。

      【讨论】:

      • x:Key 在不是资源时是多余的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多