WPF 奇怪行为:SelectedValue 设置正确,但随后重置为 NULL

WPF weird behaviour: The SelectedValue is set right BUT then ist reset to NULL

提问人:Naik 提问时间:6/6/2021 最后编辑:Naik 更新时间:6/10/2021 访问量:146

问:

我正在将 a 绑定到 ViewModel 中名为 . 设置在 时。ListBox 绑定到 ViewModel 中名为 的 Property。ListBoxListFilmeSerienListeSelectedItemismouseover = TrueSelectedItemSelectedFilmSerie

这意味着当鼠标悬停在特定 ListBoxItem 上时,将选中此 ListBoxItem 并将其值绑定到 。但这似乎效果不佳,因为出于某种原因,该物业总是.因此,我调试了应用程序,看看出了什么问题——现在奇怪的行为——实际上并不是整个时间都为 NULL。SelectedFilmSerieSelectedFilmSerieNULLSelectedFilmSerie

起初 – 当鼠标悬停在 ListBoxItem 上时 – 参数被设置为正确的 Object,它不是 NULL,但是当我进一步调试时,这个属性被调用,现在 value 参数是 NULL,这使得 Property 也是 NULL。valueSelectedFilmSerieSelectedFilmSerie

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: enter image description here enter image description here enter image description hereenter image description here

输出:

鼠标进入 ListBoxItem 的那一秒,我得到,鼠标离开 ListBoxItem 的一秒,我得到Value is NOT nullValue is NULL

enter image description here

更多详情:

ListBox 是绑定到的卡的列表,数据类型为 每个卡都是一张卡,该卡是 .FilmeSerienListeIEnumerable<FilmeSerien>ListBoxItemFilmeSerien

卡片包含多个属性,这些属性位于数据类型为 的 Property 中。喜欢:Titel、Img、Vote 等。 是一个数据类型属性。FilmeSerienVoteint

看起来像这样:

enter image description here

问题:

每次我打一颗星来投票一部电影。我得到一个 NullReferenceException,因为 是 null。SelectedFilmSerie

WPF 对于星形:

<Viewbox>
   <materialDesign:RatingBar Value="{Binding Vote}"
                              Orientation="Horizontal"
                              Foreground="SkyBlue"/>
</Viewbox>
C# WPF 绑定 nullReferenceException

评论

0赞 EldHasp 6/6/2021
请澄清。当光标仍位于所选项目上时,是否清除了“已选择”?或者当你超越它的边界时?二是触发器的正确操作。对于停止点,这将很难验证。由于切换到调试器窗口时,光标会自动离开元素并重置触发器。将输出输出到调试器控制台 (Debug.WriteLine (...)) 并对其进行跟踪。
0赞 Naik 6/6/2021
@EldHasp查看我的输出
0赞 Sir Rufo 6/6/2021
嗯,这就是属性触发器的工作方式IsMouseOver
0赞 EldHasp 6/7/2021
将触发器设置为 IsSelected 与在 ListBox UI 中选择列表项不同。很难通过您的代码来理解原因。但从你的解释来看,你混淆了这两种不同的行为。
0赞 EldHasp 6/7/2021
例如,在扩展元素中键入“星号”时,光标不再位于 ListBox 元素上方。因此,将重置 IsSelected 上的触发器。

答:

3赞 EldHasp 6/10/2021 #1

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