Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Silverlight] Combobox Binding, Как грамотно привязать справочник? 
:(
    Опции темы
webgraf
  Дата 28.9.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Здравствуйте всем!

Есть форма с данными, которая заполняется следующим классом:
Код

[DataContract]
public class PersonRecord
{
    [DataMember]
    public string Lastname { get; set; }
    [DataMember]
    public string Firstname { get; set; }
    [DataMember]
    public int? Gender { get; set; }


Gender выполнен в Combobox. Данные в комбобокс тянутся из List<DicCode>, где DicCode:
Код

[DataContract]
public class DicCode
{
    [DataMember(EmitDefaultValue = false)]
    public int code { get; set; }
    [DataMember(EmitDefaultValue = false)]
    public string name { get; set; }
}


Очень хочется загружать/выгружать все данные одним махом:
Код

this.DataContext = UpdatedPerson;


Но комбобокс привязываться не хочет. Как правильно забиндить комбобокс чтобы он по коду выбирал нужный объект? 
Много что пробовал. Менял int Gender на DicCode Gender, экспериментировал с XAML, никак не получается. Пока приходится ручками переберать Combobox.Items....  smile 
Наведите на путь истинный, пожалуйста!!
PM MAIL   Вверх
math64
Дата 29.9.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Совсем без кода наверно не получится, придётся написать по крайнеё мере конвертер, что-то типа этого:
Код

<ComboBox
  SelectedValue="{Binding Path=Gender,Converter={StaticResource GenderCodeToNameConverter}}"
  ItemsSource="{StaticResource GenderCodes}">
  <ComboBox.ItemTemplate>
    <TextBlock Text="{Binding Converter={StaticResource GenderCodeToNameConverter}}"/>
  <ComboBox.ItemTemplate/>
<ComboBox/>

(в правильности кода не уверен)

Это сообщение отредактировал(а) math64 - 29.9.2009, 08:28
PM   Вверх
webgraf
Дата 29.9.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



В Siverlight нет Combobox.SelectedValue. Есть только SelectedIndex и SelectedItem.

Используя конвертер можно поступить так:
Код

<ComboBox x:Name="Gender" DisplayMemberPath="name" 
SelectedItem="{Binding Gender, Converter={StaticResource ComboBoxItemConverter}, Mode=TwoWay}">


Собственно сам конвертер:
Код

    public class ComboBoxItemConverter : System.Windows.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // Направление "Туда" - непонятно что делать, на входе Int32, а на выходе по идее должен быть объект из коллекции
            // Combobox.Items или что то что скушает как его, но DicCode кушать не хочет....
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((ServiceReference1.DicCode)value).code;
        }
    }


В общем в коде написал все. "Обратно" работает конвертер, а что в "Туда" делать - ничего не придумаю... smile 

Это сообщение отредактировал(а) webgraf - 29.9.2009, 15:46
PM MAIL   Вверх
math64
Дата 29.9.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Можно параметром конвертеру передать коллекцию в которой нужно искать требуемый объект
PM   Вверх
webgraf
Дата 29.9.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Цитата(math64 @ 29.9.2009,  15:55)
Можно параметром конвертеру передать коллекцию в которой нужно искать требуемый объект

А как? 

Код

<ComboBox x:Name="Gender" DisplayMemberPath="name" SelectedItem="{Binding Person.Gender, Converter={StaticResource 
ComboBoxItemConverter}, ConverterParameter=Items , Mode=TwoWay}">


Передаёт string = "Items". 

Это сообщение отредактировал(а) webgraf - 29.9.2009, 16:41
PM MAIL   Вверх
math64
Дата 30.9.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Что то типа этого:
Код

<ComboBox x:Name="Gender" DisplayMemberPath="name" SelectedItem="{Binding Person.Gender, Converter={StaticResource 
ComboBoxItemConverter}, ConverterParameter={Binding ElementName=Gender,Path=Items} , Mode=TwoWay}"/>

или
Код

<ComboBox x:Name="Gender" DisplayMemberPath="name" Items="{StaticResource GenderItems}"
 SelectedItem="{Binding Person.Gender,
 Converter={StaticResource ComboBoxItemConverter},
 ConverterParameter={StaticResource GenderItems},
 Mode=TwoWay}"/>

или использовать MultiBinding, если он есть в SilverLight.

PM   Вверх
webgraf
Дата 30.9.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Первый вариант парсер отвергает в runtime

Второй вариант пришлось переделать как то так, но что в ресурсах должно быть в качестве GenderItems я не очень понял.
Код

            <ComboBox x:Name="GenderBox"  DisplayMemberPath="name" >
                <ComboBox.Items>
                    <Binding Source="{StaticResource GenderItems}"/>
                </ComboBox.Items>
                <ComboBox.SelectedItem>
                    <Binding Path="Person.Gender" Converter="{StaticResource ComboBoxItemConverter}" 
                      ConverterParameter="{StaticResource GenderItems}" Mode="TwoWay"/>
                </ComboBox.SelectedItem>
            </ComboBox>


Очень все сложно.  smile 
Неужели никто не сталкивался с такой проблемой. Может пересмотреть способ хранения?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.