c# - WPF 奇怪的行为: SelectedValue 设置正确但然后重新设置为 NULL
问题描述
我将 a 绑定ListBox
到List
名为 的 ViewModel 中的a FilmeSerienListe
。SelectedItem
时设置ismouseover = True
。ListBox的SelectedItem
绑定到 ViewModel 中名为 的属性SelectedFilmSerie
。
这意味着当鼠标悬停在特定的 ListBoxItem 上时,将选择此 ListBoxItem 并将其值绑定到SelectedFilmSerie
。但这似乎不太好用,因为由于SelectedFilmSerie
某种原因,该属性总是NULL
。所以,我调试了应用程序,看看出了什么问题——现在奇怪的行为——SelectedFilmSerie
实际上并不是整个时间都为 NULL。
起初 - 当鼠标悬停在 ListBoxItem 上时 -value
参数设置为正确的对象,并且它不是 NULL,但是当我进一步调试时,这个SelectedFilmSerie
属性被调用,现在 value 参数为 NULL,这使得SelectedFilmSerie
属性也为 NULL。
WPF:
<ListBox ItemsSource="{Binding FilmeSerienListe}"
SelectedItem="{Binding SelectedFilmSerie}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="IsSelected"
Value="true" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
C#
private IEnumerable<FilmeSerien> _filmeSerienListe;
public IEnumerable<FilmeSerien> FilmeSerienListe
{
get => _filmeSerienListe;
set
{
_filmeSerienListe = value;
NotifyPropertyChanged();
}
}
private FilmeSerien _selectedFilmSerie;
public FilmeSerien SelectedFilmSerie
{
get => _selectedFilmSerie;
set
{
Trace.WriteLine(value != null ? "Value is NOT null" : "Value is NULL");
_selectedFilmSerie = value;
NotifyPropertyChanged();
}
}
调试器:
ismouseover = True: 4xStep Over: 1xStep Over: 4xStep Over:
输出:
鼠标进入 ListBoxItem 的秒数,我得到Value is NOT null
,鼠标离开 ListBoxItem 的秒数,我得到Value is NULL
更多细节:
ListBox 是绑定到FilmeSerienListe
数据类型的卡片列表,IEnumerable<FilmeSerien>
每个ListBoxItem
卡片都是FilmeSerien
.
一张卡片包含多个属性,这些属性位于数据类型为 的属性中FilmeSerien
。喜欢:Titel、Img、Vote等。Vote
是一个int
数据类型属性。
看起来像这样:
问题:
每次我击中明星投票一部电影。我得到一个 NullReferenceException 因为它SelectedFilmSerie
是空的。
WPF 对于明星:
<Viewbox>
<materialDesign:RatingBar Value="{Binding Vote}"
Orientation="Horizontal"
Foreground="SkyBlue"/>
</Viewbox>
解决方案
如果我理解正确,您需要选择 ListBox 元素,而不是通过单击,而是将鼠标悬停在它上面。
老实说,我什至没有想到这可能需要什么。
我在评论中要求澄清这种实施的目的,但你没有回答。
但是,如果我正确理解了您的问题,那么它的实现方式如下:
<Window.Resources>
<Style x:Key="listBoxItemStyle" TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected">
<DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid VerticalAlignment="Center" >
<ListBox ItemsSource="{Binding FilmeSerienListe}"
SelectedItem="{Binding SelectedFilmSerie}"
ItemContainerStyle="{DynamicResource listBoxItemStyle}">
</ListBox>
</Grid>
推荐阅读
- javascript - 如何确定光标是否出现在 contenteditable div 中的某些字符之后
- python - 反转 2D --> 2D 非线性函数
- bash - 使用 fdisk 命令的 Bash 脚本磁盘分区
- elasticsearch - 在每个索引的小数据集上进行多索引搜索的 ElasticSearch 性能优化
- angular - 如何在状态管理中增加或减少对象属性?
- oauth-2.0 - 为 /oauth/token 配置基本身份验证
- python - 如何获取其他字段中的表字段
- javascript - 如何将数组元素分配给 onclick 函数
- html - 为什么此新闻代码中的链接无法点击?
- javascript - React - 检查数组中的重复项