C# 当ObservableCollection的值更改时,UI不会更新

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();

我有一个名为MainWindow.xaml的窗口和一个名为Tiles.xaml的页面

窗口和页面共享名为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.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看来
框架
(此处的
页面
)的内容并不是为了继承父框架的数据上下文而设计的。因此,您可能必须执行类似于所述的操作。