1

我正在尝试将通用转换器从 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,我的命令需要 a List<T>,然后我的转换器必须将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>
4

2 回答 2

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();
    }
}

我可能误解了您要达到的目标,因此请谨慎对待此建议。也许其他人可能对如何解决这个问题有更好的想法。

于 2013-11-02T19:12:42.477 回答
0

如果 aList<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)) 但您的示例似乎不需要这样做。

于 2013-11-02T20:09:59.477 回答