WPF:Usercontrol数据上下文绑定不反映对ViewModel的更改

时间:2019-05-27 13:44:40

标签: c# wpf data-binding datacontext

我有一个绑定到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}"/>

我正在尝试在主视图中更改组合框的选择时更改用户控件的内容。

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 :(得分:0)

您不应执行封装了AnotherViewModel类的SelectedItem类。

相反,在作为窗口数据上下文的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}"/>

编辑:

标准结构为:

  • 文件 MainView.xaml ,其中包含您的<Combobox>和一个xaml元素<local:usercontrol>
  • MainViewModel.cs 具有多个属性,但尤其是类型为SelectedItem的属性AnotherViewModel,并在其设置方法中引发了PropertyChangedEvent。
  • AnotherViewModel.cs 是您想要的任何东西。目标当然是您的usercontrol内部xaml绑定到您在AnotherViewModel类中定义的属性。
  • usercontrol.xaml ,基本上是另一种视图,其中xaml元素绑定到AnotherViewModel属性。

然后将<local:usercontrol>的Datacontext绑定到MainViewModel SelectedItem属性(如您在问题中所做的那样)。