提问人:Naik 提问时间:6/6/2021 最后编辑:Naik 更新时间:6/10/2021 访问量:146
WPF 奇怪行为:SelectedValue 设置正确,但随后重置为 NULL
WPF weird behaviour: The SelectedValue is set right BUT then ist reset to NULL
问:
我正在将 a 绑定到 ViewModel 中名为 . 设置在 时。ListBox 绑定到 ViewModel 中名为 的 Property。ListBox
List
FilmeSerienListe
SelectedItem
ismouseover = True
SelectedItem
SelectedFilmSerie
这意味着当鼠标悬停在特定 ListBoxItem 上时,将选中此 ListBoxItem 并将其值绑定到 。但这似乎效果不佳,因为出于某种原因,该物业总是.因此,我调试了应用程序,看看出了什么问题——现在奇怪的行为——实际上并不是整个时间都为 NULL。SelectedFilmSerie
SelectedFilmSerie
NULL
SelectedFilmSerie
起初 – 当鼠标悬停在 ListBoxItem 上时 – 参数被设置为正确的 Object,它不是 NULL,但是当我进一步调试时,这个属性被调用,现在 value 参数是 NULL,这使得 Property 也是 NULL。value
SelectedFilmSerie
SelectedFilmSerie
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 的那一秒,我得到,鼠标离开 ListBoxItem 的一秒,我得到Value is NOT null
Value is NULL
更多详情:
ListBox 是绑定到的卡的列表,数据类型为 每个卡都是一张卡,该卡是 .FilmeSerienListe
IEnumerable<FilmeSerien>
ListBoxItem
FilmeSerien
卡片包含多个属性,这些属性位于数据类型为 的 Property 中。喜欢:Titel、Img、Vote 等。 是一个数据类型属性。FilmeSerien
Vote
int
看起来像这样:
问题:
每次我打一颗星来投票一部电影。我得到一个 NullReferenceException,因为 是 null。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>
评论
IsMouseOver