Datagrid ObservableCollection为一行wpf

时间:2016-01-12 18:54:51

标签: c# wpf datagrid

我想用itemsource = {Binding Model}填充数据网格。 这没有用。似乎数据网格不了解如何显示这些属性。

简单但愚蠢的解决方法效果很好:

在viewmodel中:

Props= new ObservableCollection<MonitoringBinaryModel>();
_Model = new MonitoringBinaryModel(name);
Props.Add(_Model);

然后在xaml

itemsource={Binding Props}

当它只假设持有一个项目时,似乎很难创建一个observablecollection。是否有更好的方法可以使任何类型的实例可观察?

3 个答案:

答案 0 :(得分:2)

DataGrid旨在显示相同类型的对象集合。收藏是必须的。如果您希望DataGrid显示模型的内容,您需要遵循前者的设计,使用ObservableCollection或实现一组接口,这些接口允许以“收集方式”检索viewmodel的属性。

我以前在Windows窗体时代有一堆实现ITypedList接口的模型 - 说实话不是一个简单的练习,所以如果我是你,我宁愿选择其中任何一种方式:

  • 将模型包装到任何集合中 - 完全按照您的说法
  • 将数据网格替换为容器网格以及许多直接绑定,如下所示:

    <Grid>
        <TextBlock Grid.Column="2" Grid.Row="0" Text="Prop1"/>
    ...
        <TextBlock Grid.Column="2" Grid.Row="1" Text="{Binding Prop1}"/>
    

答案 1 :(得分:1)

ItemsSource属性的类型为IEnumarable,因此在您的MonitoringBinaryModel实施IEnumerable绑定不起作用之前。

再次因为ItemsSourceIEnumerable,您应该提供IEnumerable作为绑定来源。因此,您无需将Props设为ObservableCollection。您可以使用普通List<>或任何与IEnumerable MonitoringBinaryModel实施_Model = new MonitoringBinaryModel(name); Props = new List<MonitoringBinaryModel> { _Model }; 的内容:

CompositeCollection

其他选项是在XAML中使用<DataGrid.ItemsSource> <CompositeCollection> <Binding Path="_Model"/> </CompositeCollection> </DataGrid.ItemsSource>

var sketch1 = function (s) {
    s.setup = function () {
        s.createCanvas(100, 100);
        s.background(100);
    };

    s.draw = function () {

    }
};

new p5(sketch1, "sketch1");

答案 2 :(得分:1)

通过转换器重复使用包装器:

public class ItemsSourceConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // doesn't allow to add new rows in DataGrid
        return Enumerable.Repeat(value, 1);            
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在xaml中使用

将转换器添加到资源中:

<Window.Resources>
    <wpfApplication1:ItemsSourceConverter x:Key="ItemWrapper"/>
</Window.Resources>

并使用带有绑定的转换器资源

<DataGrid ItemsSource="{Binding Path=Model, Converter={StaticResource ItemWrapper}}" 
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Name}"/>
    </DataGrid.Columns>
</DataGrid>

<ItemsControl ItemsSource="{Binding Path=Model, Converter={StaticResource ItemWrapper}}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=Name}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>