2011-05-11 30 views
2

我想在XAML中填充自定义字符串数组,但是收到错误。我子类组合框,并添加一个字符串[]我想,以填补自定义值:在XAML中填充自定义数组属性

public class MyComboBox : ComboBox 
{ 
    public string[] MyProperty { get { return (string[])GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } } 
    public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(string[]), typeof(MyComboBox)); 
} 

我的XAML如下:

<Window x:Class="Samples.CustomArrayProperty" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Samples" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="CustomArrayProperty" Height="300" Width="300"> 
    <Grid> 
     <local:MyComboBox Height="20"> 
      <local:MyComboBox.MyProperty> 
       <sys:String>Monday</sys:String> 
       <sys:String>Wednesday</sys:String> 
       <sys:String>Friday</sys:String> 
      </local:MyComboBox.MyProperty> 
     </local:MyComboBox> 
    </Grid> 
</Window> 

当我运行它,我得到的错误:“ '星期一'不是'MyProperty'属性的有效值。“

我在做什么错?

回答

1

是否有任何其他的原因,你是否继承了你在这里做的ComboBox的子类?

因为如果这个想法是只提供字符串组合框列表,然后看看"Add collection or array to wpf resource dictionary"

尽可能倒不如让组合框照顾自己 - 通过使用的ItemsSource属性。因此,我们在链接的例子在做什么,是提供包含您的字符串列表中的“资源”,然后通过这个资源的的ItemsSource如下:

<ComboBox ItemsSource="{StaticResource stringList}" /> 

定义类型是这样的:

public class StringList : List<string> { } 

然后创建一个静态资源

<Window.Resources> 
    <local:StringList x:Key="stringList"> 
     <sys:String>Monday</sys:String> 
     <sys:String>Wednesday</sys:String> 
     <sys:String>Friday</sys:String> 
    </local:StringList > 
</Window.Resources> 

我希望帮助。

编辑:你也可以改变你的DependencyProperty使用StringList而不是String [],那么你的依赖属性也可以。

<local:MyComboBox MyProperty="{StaticResource stringList}" Height="23" /> 

然后是的DependencyProperty:

public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty",typeof(StringList),typeof(MyComboBox),new FrameworkPropertyMetadata(null, listChangedCallBack)); 

    static void listChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 
    { 
     ComboBox combo = (ComboBox)property; 
     combo.ItemsSource= (IEnumerable)args.NewValue; 
    } 

那么这将有效地做同样的事情,直接绑定到的ItemsSource。但是,如果我正确理解你的主要事情,只是为了让依赖属性起作用。

+0

谢谢你,但我只是用一个ComboBox尝试简化问题。我继承了一个自定义控件,该控件具有代码中已填充的Enumerable 属性,并且我希望尽可能使其对XAML友好,而无需更改对象的定义。 – Michael 2011-05-11 17:04:29

+0

好的,所以如果你改变你的依赖属性使用列表而不是String []会不会帮助你?当我这样做,我没有任何问题,设置属性“myProperty的=‘{StaticResource的StringList的}’” – Liz 2011-05-11 17:41:06

+0

是的,当我这样做,在一个示例项目它的工作原理,但它要求我改变我的业务对象的定义,我不当我这样做的时候,确定谁的脚趾会踩着(不幸的是,这个班似乎没有得到很好的测试 - 我将把这看作一个写更多的机会)。 – Michael 2011-05-11 18:18:23

8

您可以使用x:Array在XAML中创建数组,您仍然需要使用它作为资源,如Liz的答案。

<Window.Resources> 
    <x:Array Type="sys:String" x:Key="days"> 
     <sys:String>Monday</sys:String> 
     <sys:String>Wednesday</sys:String> 
     <sys:String>Friday</sys:String> 
    </x:Array> 
</Window.Resources> 


<local:MyComboBox Height="23" MyProperty="{StaticResource days}" /> 
+0

所以,如果我有一个UIElement属性是一个数组Type(string []例如),我必须直接设置数组的值?我希望有一种方法来在线插入数组属性。 – Michael 2011-05-11 19:01:51

+0

你可以尝试把x:array内联,对我来说编译和工作,但经常在编辑过程中出现错误,我不确定它是否受支持,并且行为在v3.5和4.0之间确实发生了变化。如果你需要经常这样做,你可以编写一个标记扩展来分割一个分隔的字符串,这可能是一行XAML。 – Kris 2011-05-11 19:12:53

+0

你的意思是 local:MyComboBox.MyProperty> ... values here ...?这并不适合我,因为它认为我试图将一个字符串[]作为单个元素添加到字符串[]中。 – Michael 2011-05-11 19:20:18

0

而且,额外的例子有enum

namespace MyNamespace 
{ 
    public enum OrganizationType 
    { 
     Office365, 
     OnPremisses 
    } 
} 

xmlns:local="clr-namespace:MyNamespace" 

<x:Array Type="local:OrganizationType" x:Key="OrganizationTypeArray"> 
    <local:OrganizationType>Office365</local:OrganizationType> 
    <local:OrganizationType>OnPremisses</local:OrganizationType> 
</x:Array>