Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > [Silverlight] Combobox Binding


Автор: webgraf 28.9.2009, 16:43
Здравствуйте всем!

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

[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 
Наведите на путь истинный, пожалуйста!!

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

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

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

Автор: webgraf 29.9.2009, 15:43
В 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 

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

Автор: webgraf 29.9.2009, 16:18
Цитата(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". 

Автор: math64 30.9.2009, 09:22
Что то типа этого:
Код

<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.

Автор: webgraf 30.9.2009, 13:24
Первый вариант парсер отвергает в 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 
Неужели никто не сталкивался с такой проблемой. Может пересмотреть способ хранения?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)