选定项目通用转换器到列表

时间:2013-11-02 18:40:04

标签: c# wpf generics datagrid

我正在尝试将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>

2 个答案:

答案 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)),但你的例子没有'似乎需要那个。