2013-06-04 20 views
5

Mam ListView, który ma Grid z dwiema kolumnami i wieloma wierszami. Każdy wiersz ma TextBlock w każdej kolumnie z każdą właściwością związaną z wartością ListView z ItemSource. Muszę wykonać konwersję tekstu w drugim TextBlock w zależności od wartości w pierwszym TextBlock. Jak mogę uzyskać wartość pierwszego pola tekstowego do konwertera?Przekazywanie wartości do IValueConverter

Oto co mam do tej pory:

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> 

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

Odpowiedz

5

Nie można podać więcej niż jedną wartość do „zwykłej” konwerter wartości. Możesz przejść z IMultiValueConverter i zdefiniować wiązanie jako MultiBinding.

Można również utworzyć IValueConverter, który pobiera cały obiekt w DataContext, rzutuje obiekt na jego typ, pobiera wartość i klucz i zwraca potrzebny łańcuch.

Na drugim textblock define wiązanie jak

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

A twój konwerter jako:

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

Spróbuj multi-wiążące. Będziesz potrzebował 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(); 
    } 
} 

i lekko zmodyfikowaną 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 na przykład, nie własność (value w tym przypadku). Wtedy będziesz mieć dostęp zarówno do konwertera Key jak i Value.

+0

Petar

Powiązane problemy