我想用itemsource = {Binding Model}填充数据网格。 这没有用。似乎数据网格不了解如何显示这些属性。
简单但愚蠢的解决方法效果很好:
在viewmodel中:
Props= new ObservableCollection<MonitoringBinaryModel>();
_Model = new MonitoringBinaryModel(name);
Props.Add(_Model);
然后在xaml
itemsource={Binding Props}
当它只假设持有一个项目时,似乎很难创建一个observablecollection。是否有更好的方法可以使任何类型的实例可观察?
答案 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
绑定不起作用之前。
再次因为ItemsSource
是IEnumerable
,您应该提供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>