gpt4 book ai didi

c# - 将 ListView 绑定(bind)到具有对象类型的 List 或 List

转载 作者:太空宇宙 更新时间:2023-11-03 18:31:02 30 4
gpt4 key购买 nike

骑在 this question 的后面,我终于有了一个完整的列表,其中值具有 ushort、ulong 等类型。

但是当我将它绑定(bind)到 ListView 并添加项目时,我得到“空白”行。换句话说,ListView 承认有项目,但它不会直观地显示它们。如果我停止并调试它,我可以清楚地查看项目的值,但对象类型似乎正在破坏它。

public interface IStatistic
{
object m_Min { get; set; }
object m_Max { get; set; }
object m_Avg { get; set; }
}

public class Statistic<T> : IStatistic
{
public T m_Min;
public T m_Max;
public T m_Avg;

object IStatistic.m_Avg
{
get{ return m_Avg;}
set { m_Avg = (T)value; }
}
object IStatistic.m_Min
{
get{ return m_Min;}
set { m_Min = (T)value; }
}
object IStatistic.m_Max
{
get{ return m_Max; }
set { m_Max = (T)value; }
}

public Statistic(T min, T max, T avg)
{
m_Min = min;
m_Max = max;
m_Avg = avg;
}
}

public ObservableCollection<IStatistic> m_MyCollection { get; set; }
m_MyCollection.add(new Statistic<ulong>(x, y, z));

XAML:

<ListView x:Name="test" ItemsSource="{Binding m_MyCollection, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Foreground="White" >
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Min"
DisplayMemberBinding="{Binding Path=m_Min, Converter={StaticResource typeConverter }}" />
<GridViewColumn Width="140" Header="Avg"
DisplayMemberBinding="{Binding Path=m_Avg}" />
</GridView>
</ListView.View>
</ListView>

我认为对象类型可能会脱离 ListView,所以我尝试制作一个类型转换器,但在这种情况下为 m_Min 调试时类型转换器从未命中。我只是想为值(value)提出任何建议。

  public class ObjectToTypeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.GetType().FullName;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new InvalidOperationException();
}
}

根据 this question这可能不可能吗?但那是 ASP.NET,所以我希望我可能误解了 C# WPF .NET 的上下文

最佳答案

WPF(和 Silverlight)中的绑定(bind)仅适用于公共(public)属性。显式接口(interface)实现,虽然看起来是公共(public)的(毕竟它们在接口(interface)上是公共(public)的)实际上是由编译器实现为 private 的,因此如果不事先转换对接口(interface)类型的引用就无法访问它们.

绑定(bind)到字段 ( public T m_Min; ) 也不会起作用,因为绑定(bind)引擎直接调用访问器方法而不是“设置”或“获取”属性值。

解决问题的最简单方法是让您的公共(public)字段自动实现属性。这将使绑定(bind)引擎能够访问它们,同时只需要对其他地方的代码进行最少的更改(将它们用作 ref/out 参数将不再起作用)并且几乎没有可测量的性能开销。

关于c# - 将 ListView 绑定(bind)到具有对象类型的 List<T> 或 List<InterfaceOfT>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22409817/

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