我试图绑定到下面DataGrid
中StringValue
对象的集合。但是每个项目都显示在单独的行中。WPF中的TreeView中的DataGrid
我希望它有一个柱状显示。例如,值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>
你真的想要在数据网格中有多行吗?为什么你使用数据网格? –
@DanField实际上没有。但我想能够选择整行。我发现DataGrid中的功能 - – Vahid
您可以在文章中添加一些内容,以显示您期望最终输出的样子吗? –