[英]WPF Datagrid inside other Datagrid
我目前正在尝试将Datagrid嵌套在另一个 Datagrid 中。
我基本上是在尝试重现这个界面(它不是我现在拥有的那个)。
这是用于创建我的界面的代码的缩小版本。
<DataGrid x:Name="myDataGrid" ItemsSource="{Binding ProductsList}" x:FieldModifier="public" AutoGenerateColumns="False" Grid.Row="1">
<DataGrid.Columns>
<DataGridTemplateColumn Width=".031*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<StackPanel >
<TextBlock Text="No. Mat" />
<TextBlock Text="Format" />
<TextBlock Text="No. Cas" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="productFormatData">
<StackPanel>
<TextBlock Text="{Binding MATProductNumber}" FontWeight="DemiBold" />
<TextBlock Text="{Binding tblFormat.FormatName}" />
<TextBlock Text="{Binding tblProduct.ProductCASNumber}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width=".05*" >
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="No. Lot" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ProductsLot}" Foreground="Black" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width=".055*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Actions" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button x:Name="modifyBtn" ToolTip="Modifier une fiche">
<materialDesign:PackIcon Kind="Pencil" Width="25" Height="25" VerticalAlignment="Center"/>
</Button>
<Button x:Name="deleteBtn" ToolTip="Supprimer la fiche">
<materialDesign:PackIcon Kind="Delete" Width="25" Height="25" VerticalAlignment="Center"/>
</Button>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="0.1*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Dangers" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
//INSERT OTHER Datagrid HERE OR RowDetails?
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid>
这部分按预期工作。 导致我出现问题的部分是Dangers ' Column (在屏幕截图中以红色突出显示)。
这是我尝试过的代码:
<DataGridTemplateColumn Width="0.1*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Dangers" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
//INSERT OTHER Datagrid HERE OR RowDetails?
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我需要在行中绑定List DangerIcons(字符串列表)。 它可以包含 0 到 8 个危险,所以我真的需要它连续出现。
基本上,我一直在阅读其他线程,似乎建议在DataGridTemplateColumn.CellTemplate的DataTemplate中添加另一个Datagrid 。 这是正确的,如果是这样,我应该怎么做?
提前致谢!
您需要的只是一个图标列表。 我认为 ItemsControl 就足够了。 请记住将其方向设置为水平。
<StackPanel Orientation="Horizontal">
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger1"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger2"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger3"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger4"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger5"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger6"}/>
<Image ... Visibility = {Binding DangerIcons ,Converter={StaticResource DangerConverter},ConverterParameter="danger7"}/>
</StackPanel>
你用你的方式
而且您必须使用“转换器”
如果 List DangerIcons 有 ("Danger2","Danger3","Danger5")
public class DangerToVisibilityConverter : MarkupExtension, IValueConverter
{
static DangerToVisibilityConverter convertor;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Type type = value.GetType();
if (type.Equals(typeof(List<string>)))
{
List<string> list = value as List<string>;
foreach(var data in list)
{
if (data.Equals(parameter.ToString()))
{
return Visibility.Visible;
}
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (convertor == null)
{
convertor = new DangerToVisibilityConverter();
}
return convertor;
}
public DangerToVisibilityConverter()
{
}
}
只有具有相应字母的元素可见。
自然必须在ResourceDictionary中注册
制作资源字典
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
...
xmlns:Converter="your converter'address">
<Converter:DangerToVisibilityConverter x:Key="DangerToVisibilityConverter "/>
</ResourceDictionary>
然后你可以使用转换器
我终于解决了,感谢Zion Yang。
我只是在 Datagrid 中添加了以下 ItemsControl:
<DataTemplate>
<ItemsControl ItemsSource="{Binding TransportClassList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Margin="5,0,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding TransportIcons}" ToolTip="{Binding DangerTypeName}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataTemplate>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.