C# 当ObservableCollection的值更改时,UI不会更新
我有一个名为MainWindow.xaml的窗口和一个名为Tiles.xaml的页面 窗口和页面共享名为MainWindowViewModel.cs的同一视图模型C# 当ObservableCollection的值更改时,UI不会更新,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个名为MainWindow.xaml的窗口和一个名为Tiles.xaml的页面 窗口和页面共享名为MainWindowViewModel.cs的同一视图模型 public class MainWindowViewModel : MainViewModel { public MainWindowViewModel() { ERP_Lite_ServiceClient client = new ERP_Lite_ServiceClient();
public class MainWindowViewModel : MainViewModel
{
public MainWindowViewModel()
{
ERP_Lite_ServiceClient client = new ERP_Lite_ServiceClient();
Parents = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == null));
if (SelectedParent != null)
{
Children = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == SelectedParent.MenuItemID));
}
client.Close();
}
private ObservableCollection<MenuItemDTO> _parents;
public ObservableCollection<MenuItemDTO> Parents
{
get
{
return _parents;
}
set
{
_parents = value;
OnPropertyChanged("Parents");
}
}
private ObservableCollection<MenuItemDTO> _children;
public ObservableCollection<MenuItemDTO> Children
{
get
{
return _children;
}
set
{
_children = value;
OnPropertyChanged("Children");
}
}
private MenuItemDTO _selectedParent;
public MenuItemDTO SelectedParent
{
get
{
return _selectedParent;
}
set
{
_selectedParent = value;
OnPropertyChanged("SelectedParent");
ERP_Lite_ServiceClient client = new ERP_Lite_ServiceClient();
Children = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == SelectedParent.MenuItemID));
client.Close();
}
}
}
这是MainWindowViewModel.cs
public class MainWindowViewModel : MainViewModel
{
public MainWindowViewModel()
{
ERP_Lite_ServiceClient client = new ERP_Lite_ServiceClient();
Parents = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == null));
if (SelectedParent != null)
{
Children = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == SelectedParent.MenuItemID));
}
client.Close();
}
private ObservableCollection<MenuItemDTO> _parents;
public ObservableCollection<MenuItemDTO> Parents
{
get
{
return _parents;
}
set
{
_parents = value;
OnPropertyChanged("Parents");
}
}
private ObservableCollection<MenuItemDTO> _children;
public ObservableCollection<MenuItemDTO> Children
{
get
{
return _children;
}
set
{
_children = value;
OnPropertyChanged("Children");
}
}
private MenuItemDTO _selectedParent;
public MenuItemDTO SelectedParent
{
get
{
return _selectedParent;
}
set
{
_selectedParent = value;
OnPropertyChanged("SelectedParent");
ERP_Lite_ServiceClient client = new ERP_Lite_ServiceClient();
Children = new ObservableCollection<MenuItemDTO>(client.GetAllMenuItems().Where(m => m.ParentID == SelectedParent.MenuItemID));
client.Close();
}
}
}
公共类MainWindowViewModel:MainViewModel
{
公共主窗口视图模型()
{
ERP_Lite_ServiceClient=新的ERP_Lite_ServiceClient();
Parents=newobserveCollection(client.GetAllMenuItems()。其中(m=>m.ParentID==null));
如果(SelectedParent!=null)
{
Children=newobserveCollection(client.GetAllMenuItems()。其中(m=>m.ParentID==SelectedParent.MenuItemID));
}
client.Close();
}
私人可观察收集(家长);;
公开募捐父母
{
得到
{
回报父母;
}
设置
{
_父母=价值;
财产变更(“父母”);
}
}
私人可观察收集儿童;
公众观察收集儿童
{
得到
{
返回儿童;
}
设置
{
_儿童=价值;
财产变更(“子女”);
}
}
将专用菜单设置为选定的父级菜单;
选择父项的公共菜单项
{
得到
{
返回_selectedParent;
}
设置
{
_selectedParent=值;
OnPropertyChanged(“SelectedParent”);
ERP_Lite_ServiceClient=新的ERP_Lite_ServiceClient();
Children=newobserveCollection(client.GetAllMenuItems()。其中(m=>m.ParentID==SelectedParent.MenuItemID));
client.Close();
}
}
}
这里是MainWindow.xaml
<Window.........>
<Window.DataContext>
<loc:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="#FF2A2A2A">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="50" />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" ItemsSource="{Binding Parents}" DisplayMemberPath="Title"
SelectedItem="{Binding SelectedParent}"
Height="35" FontSize="18" BorderThickness="0" Background="#FF2A2A2A" Foreground="White" SelectedIndex="0">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Margin" Value="5,0" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="#FF1CB4F7" />
<Setter Property="FontWeight" Value="SemiBold" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#FF87CEEB" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.Resources>
</ListBox>
</Grid>
<Frame Grid.Row="1" Source="/WPF_Client;component/Pages/Tiles.xaml"/>
</Grid>
</Window>
这是Tiles.xaml
<Page.....>
<Page.DataContext>
<self:MainWindowViewModel />
</Page.DataContext>
<ListBox ItemsSource="{Binding Children}" DisplayMemberPath="Title">
</ListBox>
</Page>
我想我已经在MainWindowViewModel.cs上正确地实现了INotifyPropertyChanged。我还使用了ObservableCollection for Children属性。但我仍然不明白为什么当子对象中的集合发生更改时,UI不会得到通知。您已经在xaml中创建了两个
MainWindowViewModel
实例。从Tiles.xaml中删除MainWindowViewModel
。谢谢,我在App.xaml中创建了ViewModel的一个实例,并在窗口和页面上引用了它。现在它工作得很好。再次感谢您提到我的代码中的错误。@Vishal看来框架
(此处的页面
)的内容并不是为了继承父框架的数据上下文而设计的。因此,您可能必须执行类似于所述的操作。