использование списка <> в качестве параметра преобразователя в виде сетки - PullRequest
0 голосов
/ 04 января 2012

Я хочу иметь возможность преобразовать целое число в строку, используя таблицу поиска (список) в моем коде.И целое число, и список передаются из COM и привязываются к наблюдаемым в моем коде.

<ListView Name="IdList" MaxWidth="310" Height="190" Margin="5" SelectionMode="Single" 
          ItemsSource="{Binding Path=TypeItem.Ids}">'

<GridViewColumn Width="Auto" 
                DisplayMemberBinding="{Binding Path=ShipType, 
                    Converter={StaticResource ShipTypeConverter}, 
                    ConverterParameter={x:Static vm:ConfigStaticItem.alternatives_shiptype}}"/>`

Я пробовал использовать мультисвязывание, но получил только DependencyProperty.UnsetValue для значения списка

<GridViewColumn Width="Auto">
  <GridViewColumnHeader Content="ShipType"/>
  <GridViewColumn.DisplayMemberBinding >
    <MultiBinding Converter="{StaticResource ShipTypeMultiConverter}">
      <Binding Path="ShipType"/>
      <Binding Path="ConfigStaticItem.alternatives_shiptype"/>
    </MultiBinding>
  </GridViewColumn.DisplayMemberBinding>
</GridViewColumn>

[ValueConversion(typeof(byte), typeof(string))]
public class ShipTypeMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            byte state = (byte)values[0];
            List<StaticId> list = (List<StaticId>)values[1];
            return state.ToString();
        }

        catch
        {
            return "";
        }
    }

Также пытался использовать шаблоны, но я думаю, что я потерялся в XAML:).

vm - это ссылка на мою ViewModel, TypeItem.Ids определен как List, где Static - это наблюдаемый класс, содержащийсреди прочего, значение ShipType

У кого-нибудь есть предложения, как решить эту проблему? enter code here

1 Ответ

3 голосов
/ 05 января 2012

И решение было:

  1. Добавление источника в мой словарь ресурсов

    <CollectionViewSource
        x:Key="ShipTypeSource"
        Source="{Binding ConfigStaticItem.alternatives_shiptype}"
        />
    
  2. Использование стандартной привязки со статическим ресурсомв качестве параметра преобразователя

    <GridViewColumn
        Width="Auto"
        Header="Ship Type"
        DisplayMemberBinding="{Binding Path=ShipType, Converter={StaticResource ShipTypeConverter},
        ConverterParameter={StaticResource ShipTypeSource}}"
        />
    
  3. и с использованием однозначного преобразователя

    [ValueConversion(typeof(byte), typeof(string))]
    public class ShipTypeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                Alternatives ShipTypes = (Alternatives)((parameter as CollectionViewSource).Source);
                byte Type = (byte)value;
                foreach (var key in ShipTypes)
                {
                    if ((uint)Type == key.Key)
                    {
                        return key.Value;
                    }
                }
                return ""; // Ship type is undefined
            }
    
            catch
            {
                return "";
            }
        }
    
        public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            return null;
        }
    }
    
...