将ListView绑定到List <t>或List <interfaceoft>,对象类型为</interfaceoft> </t>

时间:2014-03-14 15:49:33

标签: c# wpf listview

骑在this question的后面,我终于有了一个完整的List,其中Value的类型有ushort,ulong等。

但是当我将它绑定到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时类型转换器永远不会命中。我只想努力争取价值观。

  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的上下文

3 个答案:

答案 0 :(得分:3)

WPF(和Silverlight)中的绑定仅适用于公共属性。显式接口实现虽然看似公开(毕竟它们在接口上是公共的)实际上是由编译器实现为 private ,因此您无法在不转换对接口的引用的情况下访问它们事先打字。

绑定到字段(public T m_Min;)也不会起作用,因为绑定引擎直接调用访问器方法而不是&#34;设置&#34;或&#34;得到&#34;财产价值。

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

答案 1 :(得分:2)

接口是显式实现的,因此常规绑定语法在这种情况下不起作用。

要使它工作,你必须这样写:

DisplayMemberBinding="{Binding Path=(local:IStatistic.m_Min)}"

现在值将显示在ListView中,并且任何地方都不应存在绑定错误。

您必须记住导入IStatistic类型的命名空间。

答案 2 :(得分:2)

无法与WPF中的字段绑定。将您的字段设为 automatic properties ,您的代码将有效:

    public T m_Min { get; set; }
    public T m_Max { get; set; }
    public T m_Avg { get; set; }