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

标签 c# wpf listview

骑在 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/

相关文章:

c# - 为 C# .NET 编写 typeof(Xml) 的正确方法是什么?

c# - 以相同的顺序在 C# 中随机化两个 List<string>

c# - 如何制作 UI-MarkupExtension

listview - Flutter: Animation - 如何制作动画列表?

java - 如何使用我的 xml 布局文件创建自定义 ListView?

c# - ListView 的空标记不能与 SetWindowTheme 和 AutoResizeColumns 一起使用

c# - 选择正确的 ItemsSource 容器

c# - .Net - 传递可变数量的参数

wpf - F#:它没有 UI(如 WPF)吗?

wpf - 如何卡住 wpf 中数据网格的最后一列?