Заполнение пользовательского свойства массива в XAML - PullRequest
4 голосов
/ 11 мая 2011

Я пытаюсь заполнить пользовательский массив строк в 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 ]

8 голосов
/ 11 мая 2011

Вы можете создавать массивы в XAML, используя x: Array , вам все равно нужно использовать его в качестве ресурса, подобного ответу Лиз.

<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 голос
/ 31 октября 2017

И, дополнительный пример с 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>
1 голос
/ 11 мая 2011

Есть ли какая-либо другая причина, по которой вы подклассифицируете ComboBox помимо того, что вы здесь делаете?

Потому что, если идея состоит в том, чтобы просто предоставить список строк в комбинированный список, взгляните на "Добавить коллекцию или массив в словарь ресурсов wpf"

Насколько это возможно, лучше, чтобы комбобокс позаботился о себе сам - используя свойство 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" />

А затем свойство зависимости:

   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 работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...