【问题标题】:WPF weird behaviour: The SelectedValue is set right BUT then ist reset to NULLWPF 奇怪的行为: SelectedValue 设置正确但然后重新设置为 NULL
【发布时间】: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&lt;FilmeSerien&gt;,每个ListBoxItem 是一个代表FilmeSerien 的卡片。

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

看起来像这样:

问题:

每次我击中明星为电影投票。我收到 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


【解决方案1】:

如果我理解正确,您需要选择 ListBox 元素,而不是通过单击,而是通过将鼠标悬停在它上面。

说实话,我什至没有想到这可能需要什么。
我在 cmets 中要求澄清这种实现的目的,但你没有回答。

但是,如果我正确理解了您的问题,那么它的实现方式如下:

    <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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多