2013-06-04 3 views
5

У меня есть ListView, который имеет Grid с двумя столбцами и множеством строк. Каждая строка имеет TextBlock в каждом столбце с каждым свойством Text, привязанным к значению в ListView's ItemSource. Мне нужно сделать некоторое преобразование текста во втором TextBlock в зависимости от значения в первом TextBlock. Как я могу получить значение первого текстового поля в конвертере?Передача значений в IValueConverter

Вот то, что я до сих пор:

XAML:

<UserControl.Resources> 
    <local:ValueStringConverter x:Key="valueStringConverter" /> 
</UserControl.Resources> 

<ListView Name="theListView" ItemsSource="{Binding ItemCollection}" SelectedItem="{Binding SelectedItem}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Grid.Row="1" > 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Path=Key}" Grid.Column="0" Margin="0,0,10,0" /> 
       <TextBlock Text="{Binding Path=Value, Converter={StaticResource valueStringConverter}}" TextWrapping="Wrap" Grid.Column="1" /> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Код ValueStringConverter:

public class ValueStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string name = (string)value; 
     name = name.Replace("$$", " "); 
     name = name.Replace("*", ", "); 
     name = name.Replace("##", ", "); 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

ответ

5

Вы не можете передать более одного значения для «обычного» преобразователя значения. Вы можете пойти с IMultiValueConverter и определить привязку как MultiBinding.

Или вы можете создать IValueConverter, который принимает весь объект в DataContext, передает объект в его тип, принимает значение и ключ и возвращает нужную строку.

О втором TextBlock определяют связывание, как

<TextBlock Text="{Binding Converter={StaticResource valueStringConverter}"/> 

И ваш конвертер как:

public class ValueStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     MyDataContextObjectType obj= (MyDataContextObjectType)value; 
     var name= obj.Name; 
     var key = obj.Key; 
     //here you have both Name and Key, build your string and return it 
     //if you don't know the type of object in the DataContext, you could get the Key and Name with reflection 
     name = name.Replace("$$", " "); 
     name = name.Replace("*", ", "); 
     name = name.Replace("##", ", "); 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
4

Попробуйте несколько переплета. Вы будете нуждаться в IMultiValueConverter:

public class MultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var key = (string)values[0]; 
     var value = (string)values[1]; 

     // replace with appropriate logic 
     var result = key + ": " + value; 

     return result; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

и слегка измененный XAML:

<TextBlock Text="{Binding Path=Key}" Grid.Column="0" Margin="0,0,10,0" /> 
<TextBlock TextWrapping="Wrap" Grid.Column="1"> 
    <TextBlock.Text> 
     <MultiBinding Converter={StaticResource valueStringConverter}> 
      <Binding Path="Key" /> 
      <Binding Path="Value" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
0

Bind к примеру, не свойство (value в данном случае). Затем у вас будет доступ к Key и Value в конвертере.

+0

Petar

 Смежные вопросы

  • Нет связанных вопросов^_^