我正在尝试将DataGrid.SelectedItems中的泛型转换为通用列表
public class SelectedItemsToListConverter : BaseConverter, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGrid dg = (DataGrid)parameter;
Type type = parameter.GetType().MemberType.GetType();
return dg.SelectedItems.OfType<type.GetType()>().ToList();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
在object
参数中,我将整个DataGrid
通过,希望可以获得基本类型ItemsSource
但是在尝试时
dg.SelectedItems.OfType<type.GetType()>().ToList();
或
dg.SelectedItems.OfType<type>().ToList();
它无法识别类型。
如何获取类型并将其传递给dg.SelectedItems.OfType<T>
?
还有一个通用的转换器可以执行此操作吗?
注意:我需要转换SelectedItems
以将其用作ICommand
的参数,我的命令需要List<T>
,然后我的转换器必须转换< strong> SelectedItems 到List<T>
<DataGrid x:Name="CausacionesDisponibles" GridLinesVisibility="Vertical" SelectionUnit="FullRow" ItemsSource="{Binding CausacionesRealizadasAlTercero}" IsReadOnly="True" AutoGenerateColumns="False">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding DetallarCausacionCommand}" CommandParameter="{Binding ElementName=CausacionesDisponibles,Path=SelectedItems}" HERE NEED TO USE THE CONVERTER/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding StrIdDocumento}" Header="{x:Static resources:Labels.GENERAL_IdDocumeto}"/>
<DataGridTextColumn Binding="{Binding DatFechaDocumento}" Header="{x:Static resources:Labels.GENERAL_FechaDocumento}"/>
<DataGridTextColumn Binding="{Binding StrUsuarioGenera,StringFormat=\{0:d\}}" Header="{x:Static resources:Labels.GENERAL_GeneradoPor}"/>
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:0)
你有没有尝试过这样的事情:
public class SelectedItemsToListConverter<TIn, TOut> : BaseConverter, IValueConverter where TIn : class where TOut : class
{
public IEnumerable<TOut> Convert(object value, object parameter, System.Globalization.CultureInfo culture)
{
DataGrid dg = parameter as DataGrid;
// You might need some conversion logic here
return dg.SelectedItems.OfType<TIn>();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我可能错过了你想要达到的目标,所以请大家多加一些建议。也许其他人可能对如何处理这个问题有更好的了解。
答案 1 :(得分:0)
如果List<object>
可以接受,您只需执行以下操作:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGrid dg = (DataGrid)parameter;
return dg.SelectedItems.Cast<object>().ToList();
}
或者,如果您需要以其他方式获取该类型,例如在这里我采用第一个元素的类型。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGrid dg = (DataGrid)parameter;
var itemType = dg.SelectedItems[0].GetType();
var listType = typeof(List<>).MakeGenericType(itemType);
return Activator.CreateInstance(listType, dg.SelectedItems);
}
最后两行是return new List<itemType>(dg.SelectedItems);
如果你真的想要OfType
行为,即过滤到特定类型的项目,而不仅仅是Cast
,你也可以这样做,(currentItemType.IsAssignableFrom(someTargetType)
),但你的例子没有'似乎需要那个。