在XAML中填充自定义数组属性

时间:2011-05-11 15:50:02

标签: wpf arrays xaml

我正在尝试在XAML中填充自定义字符串数组,但是收到错误。我将一个ComboBox子类化,并添加了一个我想用自定义值填充的字符串[]:

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'的有效值。”。

我做错了什么?

3 个答案:

答案 0 :(得分: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}" />

答案 1 :(得分: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相同的操作。但是,如果我理解正确的话,最重要的是让Dependency属性起作用。

答案 2 :(得分:1)

并且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>