【发布时间】:2021-06-06 08:39:33
【问题描述】:
我将ListBox 绑定到名为FilmeSerienListe 的ViewModel 中的List。当ismouseover = True 时设置SelectedItem。 ListBox 的SelectedItem 绑定到ViewModel 中名为SelectedFilmSerie 的Property。
这意味着当鼠标悬停在一个特定的 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 = 真: 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>
【问题讨论】:
-
请澄清。当光标仍在所选项目上时,是否清除了 Selected?或者当你超越它的边界时?二是触发器的正确操作。有了停止点,这将很难验证。由于切换到调试器窗口时,光标会自动离开元素并重置触发器。向调试器控制台(Debug.WriteLine (...))输出并跟踪它。
-
@EldHasp 查看我的输出
-
好吧,
IsMouseOver属性的触发器就是这样工作的 -
将触发器设置为 IsSelected 与在 ListBox UI 中选择列表项不同。您的代码很难理解原因。但是从您的解释来看,您混淆了这两个不同的操作。
-
例如,当您在扩展元素中键入“星号”时,光标不再位于 ListBox 元素上。并且,相应地,IsSelected 上的触发器被重置。
标签: c# wpf binding null nullreferenceexception