C# 为什么Listbox SelectedItem返回空值?

C# 为什么Listbox SelectedItem返回空值?,c#,wpf,C#,Wpf,我想用项资源创建列表框,并在模型对象上选择editem binding 绑定操作如下所示: <ItemsControl ItemsSource="{Binding Persons}"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal">

我想用项资源创建列表框,并在模型对象上选择editem binding

绑定操作如下所示:

  <ItemsControl ItemsSource="{Binding Persons}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Name}" Width="150" />
                    <ListBox 
                        BorderThickness="0"
                        Background="Transparent"
                        Margin="0 1"
                        ItemsSource="{Binding DataContext.Skills,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Mode=OneWay}"
                        SelectedItem="{Binding MasterSkill, Mode=TwoWay}"
                        SelectionMode="Single"
                        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                        >
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

在第一次加载时,将使用默认的注册数据选择该值

切换/重新加载当前viewModel UI后会出现此问题。 当我回到ViewModel时,SelectItem为空

这些值似乎在离开UI时/之后更新(在卸载时)。 当我使用delay(>0)属性或将UpdateSourceTrigger设置为LostFocus时,问题就会消失

我在Github=> (在本例中,您必须进入“管理技能”窗口并切换到“管理项目”以最终返回技能)

我认为UI线程在卸载或销毁控件时调用事件属性Changed。。。但我真的不知道如何避免这个问题


非常感谢您的帮助。

在您粘贴的代码中,每次单击按钮时,都会创建viewmodel的新实例,这意味着现有值将被清除。这两个用户界面的情况也是如此

switch (targetViewModel)
            {
                case "1":
                    CurrentViewModel = new ProjectViewModel();
                    break;
                case "2":
                    CurrentViewModel = new ManageSkillsViewModel();
                    break;
                default:
                    CurrentViewModel = null;
                    break;
            }

这就是我要说的部分。相反,我觉得您不需要创建这样的实例,如果任何时候您需要加载新的VM,您可以尝试清除现有值。

欢迎使用StackOverflow!像您这样共享一些代码是完全合理的(事实上,对于高质量的问题,我们强烈建议您这样做);另外一个要求是直接将代码粘贴到问题中,当然只选择需要的部分。在github repo上看到您的代码,我可以清楚地说您对
NavigateTo
方法和
GoToProj
&
GoToSkills
属性有问题。每次都是创建ViewModel的新对象,而不是返回旧的初始化对象。因此,由于您正在返回新对象,因此每次都会创建一个新视图,这意味着您将失去相同类型视图的上一个实例的状态。是的,我希望重新创建该视图。但在我的例子中,数据存储在后面(通过数据提供者)。所以,如果我用存储的数据重新加载新UI,它们就不能为null。当我将断点放在集合上时,当我离开当前的ViewModel时,他似乎被调用,当值为null时。这是一个区别,创建一个新视图与重新初始化现有视图。由于您正在创建ViewModel的新对象,因此也将创建一个新的View实例。所以所选项目的所有状态都将丢失。在我的例子中,我使用从服务或其他检索的数据重新创建视图。在我的视图中修改数据后,我存储了它们。如果重新创建新视图并从服务/数据库获取数据,则该值不必为空。如果我用如下“”的文本块替换列表框,则该值不会被擦除。listbox绑定在离开UI时按null值擦除我的SelectedItem,但不知道为什么会出现这种行为。如果我使用模式LostFocus,它可以工作,但我想使用OnPropertyChanged选项。是的,但正如我前面所说,我需要创建这个实例。在此ViewModel中,我可以访问名为Persons的人员列表。我通过在BaseViewModel中注册为singleton的上下文加载此列表。所以这一个没有/从来没有刷新/清除!setter在UI销毁时调用为空值,而不是在新ViewModel创建时调用。当我使用Delay>0或UpdateSourceTrigger=LostFocus时,不会设置/启动此组件。我尝试使用数据库,并且在离开此窗口之前正确设置了值。我添加了按钮以显示包含ItemSource的内容以及源中每个人的MasterSkill值。每个人在加载UI之前都将值设置为define。我在命令GoTo中使用该按钮,没有问题,没有任何移动,所有值都保持正确设置。我在离开此ViewModel后重试该按钮,并且值设置为null,没有解释。