Привязка к свойствам на основе массива - PullRequest
3 голосов
/ 10 ноября 2010

Я пытаюсь создать пользовательский элемент управления для платформы Windows Phone 7.Пока что у меня есть определенное свойство, и оно прекрасно работает, если это простой тип (например, строка), но в конечном итоге это должен быть массив.Поэтому я определяю свое свойство следующим образом:

    #region Keywords

    public string[] Keywords
    {
        get { return (string[])GetValue(KeywordsProperty); }
        set { SetValue(KeywordsProperty, value); }
    }

    public static readonly DependencyProperty KeywordsProperty =
        DependencyProperty.Register(
            "Keywords",
            typeof(string[]),
            typeof(MyType),
            new PropertyMetadata(null));

    #endregion Keywords

Теперь я хочу привязку top top и XAML, но не могу понять, как установить свойство через XAML.Есть ли лучший способ сделать это?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2010

Использование строки [] в XAML

Вы можете создать экземпляр свойства Ключевые слова в XAML следующим образом:

<MyControl ...>
  <MyControl.Keywords>
    <sys:String>Happy</sys:String>
    <sys:String>Sad</sys:String>
    <sys:String>Angry</sys:String>
  </MyControl.Keywords>
</MyControl>

Примечание. Это предполагает объявление пространства имен

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Вы можете привязать ItemsControl к своим ключевым словам следующим образом:

<ListBox ItemsSource="{Binding Keywords}" ...>

В этом примере каждое ключевое слово будет отображаться как отдельный элемент ListBox.

Использованиеstring [] для этой цели в WPF является совершенно кошерным, поскольку гарантируется, что члены массива никогда не изменятся (вы можете заменить массив новым, но не изменять его элементы).Это связано с тем, что в массиве отсутствует механизм уведомления об изменениях.

Если ваши элементы могут измениться

Если элементы вашего массива ключевых слов могут измениться, вместо этого следует использовать ObservableCollection.массива.Сделайте его доступным только для чтения свойством CLR (не свойством зависимости) и инициализируйте его в своем конструкторе.Затем вы можете заполнить его в XAML точно так, как показано выше, но любые изменения в коллекции будут немедленно отражены в вашем пользовательском интерфейсе.

Я фактически использую для этого свои собственные классы коллекции, которые имеют гораздо больше функциональных возможностей, чем ObservableCollection.Неважно, какой класс коллекции вы используете, если он реализует INotifyCollectionChanged.

Обеспечение возможности обновления списка с использованием чистого XAML

Вы не можете обновить массив Ключевые слова с помощьюСвязывание.Если вам нужно обновить ключевые слова и сделать это полностью, используя XAML и привязки, вам нужно создать класс объектов Keyword, содержащий строку, а затем поместить их в ObservableCollection или аналогичное.

IValueConverter

Другой подход заключается в использовании IValueConverter для преобразования разделенного запятыми списка строк в строку и из нее [], например:

<TextBox Text="{Binding Keywords,
                        Converter={x:Static my:CommaSeparatedConverter.Instance}}" />

, где преобразовательбудет:

public class CommaSeparatedConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    return string.Join(",", (string[])value);
  }
  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    return ((string)value).Split(',');
  }
}
0 голосов
/ 11 ноября 2010

Вы должны иметь возможность связываться с определенным элементом массива следующим образом:

<Textblock Text="{Binding Keywords[0]}" />

при условии, конечно, что Ключевые слова доступны в текущем DataContext.

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