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