骑在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的上下文
答案 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; }