2016-07-16 3 views
-1

У меня проблема с привязкой к WPF, которую я не получаю. У меня есть установка MVVM вроде следующей:WPF (mvvm) databinding itemssource и selecteditem для разных моделей

public class ModelA 
{ 
    public int Id 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ModelB 
{ 
    public ModelA The_A 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ViewModel 
{ 
    public IEnumerable<ModelA> ModelAList 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelB> ModelBList 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

DataContext Моего XAML является ViewModel (сюрприз), и я получил этот ListBox в нем:

<ListBox ItemsSource="{Binding ModelBList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ModelAList" 
       SelectedItem="{Binding The_A}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Когда я открываю окно, в ComboBox не имеет выбранного элемента, но если я выберу что-то из флажка, то The_A будет настроено на все, что я выбрал.

Я полагаю, что ModelA в моем Modelalist отличаются от ModelA в ModelB. Могу ли я заставить эту привязку работать? Возможно, я пропустил что-то очевидное, или я не буду правильно атаковать проблему.

Спасибо большое!

+0

В поле флажка привязано к '' – SilentCoder

+0

О, боже, я использовал CheckBox вместо ComboBox. Я хотел использовать combobox, следовательно, свойства selecteditem и itemssource. Я прошу прощения за то! Установка режима на TwoWay не влияет, к сожалению, но спасибо за предложение! –

+0

Приятно это слышать. Вот так .. Привет! – SilentCoder

ответ

-1

После небольшого финиша я нашел решение проблемы. В ответе IDisposable указано, что выпадающее поле не может сразу связываться с двумя отдельными объектами. Поэтому, когда экземпляр ViewModel создается (и после загрузки списка ModelA), список может быть скопирован в каждый ModelB для привязки. Решение ниже.

public class ModelA 
{ 
    public int Id 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ModelB 
{ 
    public ModelA The_A 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelA> The_A_List 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     //Load lists 
     foreach (var b in ModelBList) 
     { 
      b.The_A_List = ModelAList; 
     } 
    } 

    public IEnumerable<ModelA> ModelAList 
    { 
     //Property uses INotifyPropertyChanged 
    } 

    public IEnumerable<ModelB> ModelBList 
    { 
     //Property uses INotifyPropertyChanged 
    } 
} 

Это дает затем следующие привязки в XAML:

<ListBox ItemsSource="{Binding ModelBList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ComboBox 
       ItemsSource="{Binding The_A_List}" 
       SelectedItem="{Binding The_A}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

И все хорошо. Еще раз спасибо за IDisposable за помощь и поставил меня на путь к просветлению.

3

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

Ну, у вас есть свой источник товаров, связанный правильно с ModelList IEnumerable.

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

Следовательно, создать свойство в классе ViewModel следующим образом:

private ModelA _selectedComboBoxItem; 
public ModelA SelectedComboBoxItem 
{ 
    get { return _selectedComboBoxItem; } 
    set 
    { 
     _selectedComboBoxItem = value; 
     Propertychanged(this, "SelectedComboBoxItem"); 
    } 
} 

Затем привязать его к SelectedItem следующим образом:

SelectedItem="{Binding SelectedComboBoxItem}" 

Это, очевидно, должно работать.

EDIT: Дополнительную информацию можно получить по запросу.

Предположим, у вас есть дюжина апельсинов с вами. Если вы получаете человека, который выбирает случайным образом из них, что вы получаете? Оранжевый сам? Это и идея этого. Если вы выберете элемент combobox, он будет иметь тот же тип, что и его источник.

Если у вас много списков со списком в том же элементе списка, вы можете изменить тип данных ItemsSource, чтобы удержать это много списков или свойств.

Для примера: Скажем, у меня есть список с 2 полями combobox и 2. Таким образом, my itemssource будет ObservableCollection, и эта наблюдаемая коллекция будет содержать 2 перечисления, а также 2 строки для хранения значений 4 элементов управления. Вы также можете создать 2 дополнительных свойства для привязки выбранных элементов каждого выпадающего списка, если хотите.

+0

Как вы можете видеть, я хочу иметь возможность установить свойство «The_A» в каждом ModelB в ModelBList с этой привязкой, я боюсь, что ваше решение не совсем режет его (в списке есть несколько флажков). –

+0

Это просто невозможно связать с двумя разными объектами таким образом? Если да, есть ли другой способ добиться желаемого поведения? P.S. Я имел в виду «combobox» выше, а не checkbox, мой плохой! –

+0

Я отредактировал ответ и добавил дополнительную информацию в соответствии с вашими сомнениями. Пожалуйста, проверьте. – ViVi

Смежные вопросы