gpt4 book ai didi

c# - Listview滚动触发Combobox SelectedValue并抛出异常

转载 作者:行者123 更新时间:2023-12-03 10:39:06 24 4
gpt4 key购买 nike

我在 WPF 中的一个应用程序中遇到了一个非常奇怪的问题,其中很多屏幕与绑定(bind)和组合框配合得非常好。但其中之一给我带来了问题。

我创建了一个屏幕来为应用程序中定义的每个用户定义一个配置文件。所以它是一个 Listview,每一行都是一个标签(用户名)和一个带有配置文件列表的组合框。
一切都是通过绑定(bind)来定义的。

这是 ListView 的 XAML(我删除了样式):

<ListView Name="lv_UserProfils" ItemsSource="{Binding ListeEntites}" AlternationCount="2"
ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<ListView.View>
<GridView>
<GridViewColumn Header="Nom d'utilisateur" Width="250">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border Height="25">
<TextBlock Text="{Binding UserLogin}" Width="Auto" />
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Profil" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding DataContext.ListeProfils, ElementName=lv_UserProfils}"
DisplayMemberPath="LibProfil" SelectedValuePath="IdProfil"
SelectedValue="{Binding Profil.IdProfil}"
SelectedItem="{Binding Profil}" Width="200" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
DataContext是自定义 ViewModel 类的一个实例,它提供了 ObservableCollection<UserBE>命名为 ListeEntites
UserBE或多或少:
public sealed class UserBE
{
public bool IsAdmin { get; set; }
public bool IsUpdateGranted { get; set; }

private string _userLogin;
public string UserLogin
{
get { return _userLogin; }
set { _userLogin = value; OnPropertyChanged("UserLogin"); }
}

private ProfilBE _profil;
public ProfilBE Profil
{
get { return _profil; }
set
{
_profil = value;
OnPropertyChanged("Profil");
}
}
}

ProfilBE
public sealed class ProfilBE
{
public long IdProfil { get; set; }

private string _codProfil;
public string CodProfil
{
get { return _codProfil; }
set { _codProfil = value; OnPropertyChanged("CodProfil"); }
}

private string _libProfil;
public string LibProfil
{
get { return _libProfil; }
set { _libProfil = value; OnPropertyChanged("LibProfil"); }
}
}

这是我的问题:
用户列表很长,所以有一个滚动条。我可以随心所欲地向下滚动,但只要我向上滚动(但前提是我向下滚动足够多),所有未显示的组合框一旦出现在屏幕上就会开始被清除。

有趣的事实 :
  • 当我滚动时,Profil在与显示的行关联的对象上不断调用 setter。我不知道为什么(没有原因,Profil 属性已经定义)
  • 在某一时刻,如果我向上滚动,我会得到很多这样的异常,而 Profil setter 开始接收 null作为值

  • .
    System.Windows.Data Error: 23 : Cannot convert 'BanquePrivee.AssuranceVie.Net.BE.ProfilBE' from type 'ProfilBE' to type 'System.Int64' for 'fr-FR' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: Int64Converter cannot convert from BanquePrivee.AssuranceVie.Net.BE.ProfilBE.
    at System.ComponentModel.TypeConverter.GetConvertFromException(Object value)
    at System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'

    System.Windows.Data Error: 7 : ConvertBack cannot convert value 'BanquePrivee.AssuranceVie.Net.BE.ProfilBE' (type 'ProfilBE'). BindingExpression:Path=Profil.IdProfil; DataItem='UserBE' (HashCode=59629589); target element is 'ComboBox' (Name=''); target property is 'SelectedValue' (type 'Object') NotSupportedException:'System.NotSupportedException: Int64Converter cannot convert from BanquePrivee.AssuranceVie.Net.BE.ProfilBE.
    at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
    at MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
    at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

    很明显, SelectedValue="{Binding Profil.IdProfil}"是问题,但我不明白为什么。
    我不明白为什么在某些时候它会尝试转换 IdProfilProfilBE .我不应该在那里使用转换器。
    我做了很多测试,数据似乎很好(不应该有空值等)

    有人可以指出我做错了什么吗?

    最佳答案

    我认为这与设置 SelectedValueSelectedItem .这两个属性都做同样的事情:它们设置选定的项目。但是有人将其设置为 Value基于SelectedValuePath是,另一个只是将它设置为 ItemsSource 中的一个项目.

    我猜 WPF 在某处感到困惑并试图设置 SelectedValue (这是 int )到 SelectedItem ,其类型为 ProfilBE ,并抛出异常,因为 ProfilBE不能转换为 int。

    但无论如何,要修复它,请尝试删除 SelectedItem在您的 ComboBox 中绑定(bind)

    <ComboBox ItemsSource="{Binding DataContext.ListeProfils, ElementName=lv_UserProfils}" 
    DisplayMemberPath="LibProfil" SelectedValuePath="IdProfil"
    SelectedValue="{Binding Profil.IdProfil}"
    Width="200" />

    关于c# - Listview滚动触发Combobox SelectedValue并抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627674/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com