【问题标题】:WPF: Usercontrol datacontext binding does not reflect changes to ViewModelWPF:用户控件数据上下文绑定不反映对 ViewModel 的更改
【发布时间】:2019-05-27 13:44:39
【问题描述】:

我有一个绑定到 Combobox 的集合,它的 SelectedItem 绑定到我的 viewmodel 属性 SelectedItem。

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

SelectedItem的类如下:

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

我使用了如下的用户控件:

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

【问题讨论】:

  • SelectedItem 会引发PropertyChanged 事件吗?
  • 是的。对不起,我忘了提。每个属性都实现了 INotifyPropertyChanged。 JFYI,在我创建一个新的用户控件并将公共代码移到它之前,它在单个视图中运行良好..
  • 请提供更多详细信息。例如,UserControl 是如何定义的?还有SelectedItem 属性?您是否将其设置为新的 SelectedItem 属性。
  • @mm8,这是一个设置了 DataContext 的简单 WPF 用户控件。我还没有实现任何依赖属性...
  • 所以UserControl 是空的?当您选择一个项目时,您希望发生什么?

标签: c# wpf data-binding datacontext


【解决方案1】:

你不应该做一个类 SelectedItem 来封装你的 AnotherViewModel 类。

相反,在作为窗口数据上下文的视图模型中,您应该拥有:

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

之后,您编辑您的 xaml,以便您的用户控件绑定到您的视图模型属性 SelectedItem:

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

编辑:

标准结构是:

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

然后您将 &lt;local:usercontrol&gt; 的 Datacontext 绑定到您的 MainViewModel SelectedItem 属性(就像您在问题中所做的那样)。

【讨论】:

  • 我在 MainView 中使用的 MainViewModel 中还有其他属性。 AnotherViewModel 是我的 MainViewModel 的一部分。
  • 你能给我们更多关于你的 MainViewModel 和你的 UserControl 声明的信息吗?在您的示例中, AnotherViewModel 似乎不是您的 MainViewModel 的一部分
  • 我很难弄清楚你的文件结构。您是否有: - 带有组合框和 的 MainView - 带有属性“SelectedItem”和其他属性的 MainViewModel。 - 具有任何属性的另一个视图模型 如果是这种情况,则 MainViewModel 中的其他属性没有问题。重要的是,此 MainViewModel 有一个名为 SelectedItem 的属性,指向对象 AnotherViewModel。
  • @VincentHV,请找到更新后的 ViewModel 结构。感谢您的帮助
  • 同意@lema,你的类 Item 在那里没用。您可以将 AnotherViewModel 作为 MainViewModel SelectedItem 属性的类型。如果你想在你的组合框中有不同类型的 ViewModel,一个界面会更好。您定义接口 IItem,暂时为空,然后将 IItem 作为 MainViewModel SelectedItem 属性的类型,然后使您的类 AnotherViewModel 和您想要在组合框中显示的其他视图模型类实现您的接口IItem。我知道你没有以任何方式填充你的组合框?
猜你喜欢
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多