首页 > 解决方案 > WPF 奇怪的行为: SelectedValue 设置正确但然后重新设置为 NULL

问题描述

我将 a 绑定ListBoxList名为 的 ViewModel 中的a FilmeSerienListeSelectedItem时设置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>

标签: c#wpfbindingnullnullreferenceexception

解决方案


如果我理解正确,您需要选择 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>

推荐阅读