WPF: привязка текстового контекста Usercontrol не отражает изменения в ViewModel - PullRequest
0 голосов
/ 27 мая 2019

У меня есть коллекция, связанная с Combobox, и ее SelectedItem привязан к моему свойству viewmodel SelectedItem.

<ComboBox ItemsSource="{Binding itemSource}"
          SelectedItem="{Binding SelectedItem}"/>

Класс SelectedItem выглядит следующим образом:

public class SelectedItem
{
   public AnotherViewModel anotherViewModel {get;set;}
}

Я использовал Usercontrol, как показано ниже:

<local:usercontrol DataContext="{Binding SelectedItem.anotherViewModel}"/>

Я пытаюсь изменить содержимое usercontrol при изменении выделения в выпадающем списке на главном экране.

Изменения в свойствах anotherViewModelотражает вид только в первый раз.При отладке кода я обнаружил, что свойства anotherViewModel содержат новые значения, но они не отражаются на просмотре.

Любая помощь будет принята.

Редактировать

Public class MainViewModel
{
   public string property1 {get;set;} //has propertychanged implemented
   public ObservableCollection<Item> Items {get;set;} //combobox itemsource
   public Item SelectedItem {get;set;}//combobox selecteditem  
}

public class Item
{ 
  public AnotherViewModel anotherViewModel {get;set;}//has propertychanged implemented
}

public class AnotherViewModel
{
  public string property1 {get;set;} //has propertychanged implemented
  public string property2 {get;set;} //has propertychanged implemented
  public ObservableCollection<string> items {get;set;} //has propertychanged implemented
}

<Window>
  <Textbox Text="{Binding property1}"/>
   <ComboBox ItemsSource="{Binding Items}"
          SelectedItem="{Binding SelectedItem}"/>
  <local:usercontrol DataContext="{Binding SelectedItem.anotherViewModel}"/>
<Window> 

<UserControl>
   <ListView ItemsSource="{Binding items}"/>
</UserControl>

1 Ответ

0 голосов
/ 27 мая 2019

Вы не должны делать класс SelectedItem, инкапсулирующий ваш класс AnotherViewModel.

Скорее, в viewmodel, который является текстовым текстом вашего окна, вы должны иметь:

private AnotherViewModel _selectedItem;
public AnotherViewModel SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem = value; OnPropertyChanged(nameof(SelectedItem)); }
    }

После этого выотредактируйте xaml так, чтобы ваш usercontrol связывался с вашим свойством viewmodel SelectedItem:

<local:usercontrol DataContext="{Binding SelectedItem}"/>

EDIT:

Стандартная структура будет:

  • Файл MainView.xaml , содержащий ваш <Combobox> и элемент xaml <local:usercontrol>.
  • MainViewModel.cs , имеющий несколько свойств, но особенно свойствоSelectedItem типа AnotherViewModel и вызов свойства PropertyChangedEvent в его установщике.
  • AnotherViewModel.cs - все, что вы хотите.Цель, конечно, состоит в том, чтобы ваш usercontrol внутренний xaml связывался со свойствами, которые вы определили в AnotherViewModel class.
  • usercontrol.xaml , который в основном является другим представлением, в котором элементы xamlсвязаны с AnotherViewModel свойствами.

И затем вы привязываете Datacontext вашего <local:usercontrol> к свойству MainViewModel SelectedItem (как вы делали в своем вопросе).

...