我试图绑定到DataGrid
中的StringValue
对象集合,但每个项都显示在单独的行中。我希望使用分栏显示,其中565477
和65656
等值显示在同一行中。以下是我当前的代码:
XAML文件:
<TreeView>
<TreeViewItem Header="Warnings">
<TreeView ItemsSource="{Binding WarningCategories}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Warnings}">
<TextBlock Text="{Binding Path=Category}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Fields}" AutoGenerateColumns="True" HeadersVisibility="None">
</DataGrid>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</TreeViewItem>
</TreeView>
程式码后置:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<WarningCategory> WarningCategories { get; set; }
public ViewModel()
{
WarningCategories = new ObservableCollection<WarningCategory>();
ObservableCollection<Warning> warnings = new ObservableCollection<Warning>
{
new Warning( new StringValue("565477"), new StringValue("65656")),
new Warning( new StringValue("767455"), new StringValue("75642")),
};
WarningCategories.Add(new WarningCategory("Warning One", warnings));
warnings = new ObservableCollection<Warning>
{
new Warning( new StringValue("565477"), new StringValue("65656")),
new Warning( new StringValue("767455"), new StringValue("75642")),
};
WarningCategories.Add(new WarningCategory("Warning Two", warnings));
}
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class WarningCategory
{
public string Category { get; set; }
private ObservableCollection<Warning> m_warnings;
public ObservableCollection<Warning> Warnings
{
get
{
return m_warnings ?? (m_warnings = new ObservableCollection<Warning>());
}
}
public WarningCategory(string category, ObservableCollection<Warning> animals)
{
Category = category;
m_warnings = animals;
}
}
public class Warning
{
public ObservableCollection<StringValue> Fields { get; set; }
public Warning(params StringValue[] fields)
{
Fields = new ObservableCollection<StringValue>(fields);
}
}
public class StringValue
{
public StringValue(string s)
{
Value = s;
}
public string Value { get; set; }
}
我想达到的结果是这样的:
我有一个解决方法,但它不支持多重选择。下面是此解决方法的代码:
<ItemsControl ItemsSource="{Binding Fields}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value}" Width="150"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如何使用DataGrid
实现所需的柱形显示并保持对多选的支持?
3条答案
按热度按时间pwuypxnk1#
而不是DataGrid(它可以进行透视,但会有问题),使用ListBox和ItemsPanel水平StackPanel
若要启用整行选择,请使用我创建的ListBoxItem.IsSelected到TreeViewItem.IsSelected的绑定
djmepvbi2#
我建议不要使用
DataGrid
,并且我也会重新修改您的模板目前的工作方式。我认为,类似这样的东西非常接近您想要的:在
Warning
类中添加以下内容后:如下所示:
使用列表应该允许您所寻找的方式进行多重选择。
x6h2sr283#
建立您要用于数据系结的新类别。
等级
视图模型
XAML语言