WPF 奇怪的行为:SelectedValue 设置正确但然后 ist 重置为 NULL
WPF weird behaviour: The SelectedValue is set right BUT then ist reset to NULL
我正在将 ListBox
绑定到名为 FilmeSerienListe
的 ViewModel 中的 List
。当ismouseover = True
时设置SelectedItem
。 ListBox 的 SelectedItem
绑定到名为 SelectedFilmSerie
.
的 ViewModel 中的 属性
这意味着当鼠标悬停在一个特定的 ListBoxItem 上时,这个 ListBoxItem 被选中并且它的值绑定到 SelectedFilmSerie
。但这似乎不太有效,因为 SelectedFilmSerie
属性 由于某种原因总是 NULL
。因此,我调试了该应用程序以查看出了什么问题 – 现在奇怪的行为 – SelectedFilmSerie
实际上不是整个时间 NULL。
起初——当鼠标悬停在 ListBoxItem 上时——value
参数设置为正确的对象,并且它不是 NULL,但是当我进一步调试时 SelectedFilmSerie
属性 被召回,现在值参数为 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 = 真:
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>
如果我没理解错的话,您需要 select 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>
我正在将 ListBox
绑定到名为 FilmeSerienListe
的 ViewModel 中的 List
。当ismouseover = True
时设置SelectedItem
。 ListBox 的 SelectedItem
绑定到名为 SelectedFilmSerie
.
这意味着当鼠标悬停在一个特定的 ListBoxItem 上时,这个 ListBoxItem 被选中并且它的值绑定到 SelectedFilmSerie
。但这似乎不太有效,因为 SelectedFilmSerie
属性 由于某种原因总是 NULL
。因此,我调试了该应用程序以查看出了什么问题 – 现在奇怪的行为 – SelectedFilmSerie
实际上不是整个时间 NULL。
起初——当鼠标悬停在 ListBoxItem 上时——value
参数设置为正确的对象,并且它不是 NULL,但是当我进一步调试时 SelectedFilmSerie
属性 被召回,现在值参数为 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 = 真:
输出:
鼠标进入 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>
如果我没理解错的话,您需要 select 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>