XAML ComboBox SelectedIndex Привязка к свойству ViewModel - PullRequest
0 голосов
/ 01 июня 2011

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

Я постараюсь сделать мою проблему короткой, но по существу.

Используя WPF и методологию MVVM, у меня есть: A View и ViewModel.

Из представления XAML я связываю comboBox со списком значений в объекте словаря ключ / значение.Это работает нормально - я могу видеть выпадающие значения, когда я нажимаю на поле со списком.

Примечание: Каждая запись может иметь более 1 партии в сетке, где отображается комбинированный список.

<dxg:GridColumn Header="Instalments" 
        Width="100" 
        AllowSorting="False" 
        AllowAutoFilter="False">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
    <ComboBox IsEnabled="{Binding Data.IsIncludedInDD}"
              Name="cbInstalmentValues" 
              Width="200"
              ItemsSource="{Binding Data.D_InstalmentValues}"
              SelectedIndex="{Binding Data.Instalments, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              DisplayMemberPath="Value" 
              SelectedValuePath="Key"
              SelectedValue="{Binding SelectedInstalmentValue, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}"
              VerticalAlignment="Center" />

Код:

private static readonly Dictionary<int, string> D_instalmentValues = new Dictionary<int, string>
{
  {0, "None"}, 
  {1, "1 Instalment"}, 
  {2, "2 Instalments"}, 
  {3, "3 Instalments"}, 
  {4, "4 Instalments"},
  {5, "5 Instalments"}, 
  {6, "6 Instalments"}, 
  {7, "7 Instalments"}, 
  {8, "8 Instalments"}, 
  {9, "9 Instalments"},
  {10, "10 Instalments"}, 
  {11, "11 Instalments"}, 
  {12, "12 Instalments"}
};

public Dictionary<int, string> D_InstalmentValues 
{
  get
  {
    return _instalmentValues;
  }
  set
  {
    _instalmentValues = value;
  }
}

Итак, когда я загружаю свое приложение, я хочу, чтобы comboBox считывал значение из свойства 'Installments' в viewmodel и связывался с тем же индексомзначение в словаре и отображать количество взносов .. т.е.: нет, 1 взнос и т. д. *

public int Instalments
{
    get
    {
        return _chargeTemplate.Instalments;
    }

    set
    {
    if (value == -1)
    {
        value = value + 1;
        _chargeTemplate.Instalments = _chargeTemplate.Instalments;
    }
    else
    {
        if (_chargeTemplate.Instalments == value)
        {
            return;
        }
        else
        {
            _chargeTemplate.Instalments = value;
        }
     }
     //NotifyNotRegister("Instalments");
     RaisePropertyChanged("Instalments");
    }
}

Теперь значение '_chargeTemplate.Instalments' содержит значение из столбца Рассрочка из записи вбаза данных.

Похоже, что поле со списком не связывается, если значение в свойстве Installments равно 0. Поле не заполнено.

Заполняется после выбора записи, значение которой большечем 0.

Когда я попытался заполнить все поля рассрочки в таблице sql значениями от 1 до 12, выбранный индекс не был установлен правильно для самого первогов моем приложении отображается ecord, но если я выбрал следующую запись, она отображалась нормально ... тогда, если я снова выбрал первую запись, она также отображалась правильно.

Другая странная часть поведения была для первой записи, если у меня было 3 части, а в части 1 = 2 таблицы sql - часть 2 = 4 и часть 3 = 0 ... в первых 2 частях этой записи был установлен индекс комбинированного списка, но последняя запись была пустой.

В итоге - мне нужно знать, как при загрузке приложения - как сделать привязку выбранного индекса из модели представления к представлению, при этом поле со списком не будет пустым для первой записи или для значений, для которых выбран индекс0.

Надеюсь, здесь достаточно информации ...

Большое спасибо

ОБНОВЛЕНИЕ:

Я внес небольшое изменение в XAML исвойство, с которым я связываю combobox selectedindex.Это позволяет значению 0 отображать «Нет» в выпадающем списке, где значение равно 0 для значения взноса сотрудников в базе данных sql.

Однако самый первый человек, отображаемый в списке записей, не имеет выбранныйindex установлен на индекс значения словаря, если я не выберу другого человека и снова не выберу первого человека ... странно

ViewModel

public int Рассрочка {get {return _chargeTemplate.Instalments;}}

XAML

SelectedIndex = "{Binding Data.Instalments, Mode = OneWay}"

1 Ответ

3 голосов
/ 02 июня 2011

Я нашел ответ в конце концов, немного поглядев на экран и осознав, что пропустил 1 СЛОВО !!!!

Я полностью удалил свойство SelectedIndex из элемента управления combobox и использовал 'SelectedValue 'вместо.Также перед пропущенным словом отсутствовало слово «Данные».

С некоторыми корректировками свойств в модели представления это сработало, отображая правильное значение в выпадающем списке из базы данных при загрузке приложения

* 1006.* См. Ниже:)

Спасибо!

DisplayMemberPath = "Value" SelectedValuePath = "Key" SelectedValue = "{Binding Data.SelectedInstalmentValue, Mode = TwoWay, ValidatesOnDataErrors = True, NotifyOnrorid= True, UpdateSourceTrigger = PropertyChanged} "Style =" {StaticResource ValidationStyle} "VerticalAlignment =" Центр "/>

...