c#-当DataGrid嵌套在分组的DataGrid中时,相对列宽不起作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-当DataGrid嵌套在分组的DataGrid中时,相对列宽不起作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5400字,纯文字阅读大概需要8分钟。
内容图文
![c#-当DataGrid嵌套在分组的DataGrid中时,相对列宽不起作用](/upload/InfoBanner/zyjiaocheng/662/7da6b4070ecd40ca9e106f327c0a87cc.jpg)
假设我有一个具有6个属性的对象:
public class MyClass
{
public string Attribute1 { get; set; }
public string Attribute2 { get; set; }
public string Attribute3 { get; set; }
public string Attribute4 { get; set; }
public string Attribute5 { get; set; }
public string Attribute6 { get; set; }
}
我在DataGrid中显示这些对象的集合:
<Grid>
<DataGrid x:Name="myGrid" Margin="5, 5, 5, 5" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True">
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Attribute1" Binding="{Binding Attribute1}" Width="5*"/>
<DataGridTextColumn Header="Attribute2" Binding="{Binding Attribute2}" Width="5*"/>
<DataGridTextColumn Header="Attribute3" Binding="{Binding Attribute3}" Width="10*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
我这样填充网格,按“ Attribute1”分组…
public MainWindow()
{
InitializeComponent();
ObservableCollection<MyClass> data = new ObservableCollection<MyClass>();
data.Add(new MyClass { Attribute1 = "Red", Attribute4 = "Circle", Attribute5 = "Large", Attribute6 = "Transparent" });
data.Add(new MyClass { Attribute1 = "Red", Attribute4 = "Square", Attribute5 = "Medium", Attribute6 = "Opaque" });
data.Add(new MyClass { Attribute1 = "Red", Attribute4 = "Triangle", Attribute5 = "Large", Attribute6 = "Opaque" });
data.Add(new MyClass { Attribute1 = "Yellow", Attribute4 = "Square", Attribute5 = "Large", Attribute6 = "Transparent" });
data.Add(new MyClass { Attribute1 = "Blue", Attribute4 = "Triangle", Attribute5 = "Small", Attribute6 = "Transparent" });
data.Add(new MyClass { Attribute1 = "Blue", Attribute4 = "Sphere", Attribute5 = "Small", Attribute6 = "Opaque" });
ListCollectionView lcv = new ListCollectionView(data);
lcv.GroupDescriptions.Add(new PropertyGroupDescription("Attribute1"));
myGrid.ItemsSource = lcv;
}
我设置GroupItems的样式以在扩展器中显示嵌套的DataGrid:
<Window.Resources>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp" IsExpanded="True" Foreground="Black">
<Expander.Header>
<TextBlock Foreground="Black" Text="{Binding Name}"/>
</Expander.Header>
<DockPanel>
<DataGrid ItemsSource="{Binding Items}" x:Name="subGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Attribute 4" Binding="{Binding Attribute4}" Width="Auto"/>
<DataGridTextColumn Header="Attribute 5" Binding="{Binding Attribute5}" Width="Auto"/>
<DataGridTextColumn Header="Attribute 6" Binding="{Binding Attribute6}" Width="Auto"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
将我嵌套的DataGrid列的宽度设置为“自动” …,效果很好:
问题是当我尝试使用相对宽度时…
<DataGrid ItemsSource="{Binding Items}" x:Name="subGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Attribute 4" Binding="{Binding Attribute4}" Width="1*"/>
<DataGridTextColumn Header="Attribute 5" Binding="{Binding Attribute5}" Width="1*"/>
<DataGridTextColumn Header="Attribute 6" Binding="{Binding Attribute6}" Width="2*"/>
</DataGrid.Columns>
</DataGrid>
现在看起来像这样…
列不仅非常瘦,而且不能像往常一样使用鼠标来调整它们的大小.
这个问题确实让我感到困惑.我已经搜索过SO,并尝试了一些与运气相关的问题.
如何设置嵌套DataGrid上的列以使用相对宽度?
解决方法:
我认为问题在于WPF不知道DockPanel的宽度如何,因此您会得到那些瘦小的列.
一种解决方案是将DockPanel(或DataGrid)的宽度设置为固定宽度,例如500像素.
另一个解决方案是将DataGrid的宽度绑定到DockPanel的ActualWidth.这可以工作,但是DataGrid只会增大大小,而当窗口变小时不会缩小.
<DataGrid ItemsSource="{Binding Items}"
x:Name="subGrid"
AutoGenerateColumns="False"
IsReadOnly="True"
CanUserAddRows="False"
Width="{Binding
RelativeSource={RelativeSource AncestorType=DockPanel}, Path=ActualWidth}">
另一个解决方案是将DockPanel的宽度绑定到Expander的ActualWidth.问题是它不能正常工作… Expander变大,因为DockPanel变大,我们陷入了循环.我们真正想要的是扩展器的ActualWidth减去足以不使扩展器增加其宽度的值.我尝试了一下,“ ActualWidth-3”似乎有效(但是idk为什么3 …).如果添加填充或边距,则可能需要更改这3个.为了使它成为一个绑定,我们需要一个IValueConverter.
public class ActualWidthConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is double)
return (double)value - 3;
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
您需要将转换器添加为资源(应用程序或窗口或其他):
<Window ....
xmlns:app="clr-namespace:WpfApplication25">
<Window.Resources>
<app:ActualWidthConverter x:Key="ActualWidthConverter" />
</Window.Resources>
而且,当然,您需要将绑定应用于DockPanel的Width:
<DockPanel Width="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=ActualWidth, Converter={StaticResource ActualWidthConverter}}">
这不是一个完美的解决方案,但也许会有所帮助?此方法的替代版本可以使用MultiBinding.传递扩展器的ActualWidth和DockPanel的Margin:ActualWidth-Margin.Left-Margin.Right-3(我仍然想知道为什么3?在其他人的计算机上也将是3).
内容总结
以上是互联网集市为您收集整理的c#-当DataGrid嵌套在分组的DataGrid中时,相对列宽不起作用全部内容,希望文章能够帮你解决c#-当DataGrid嵌套在分组的DataGrid中时,相对列宽不起作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。