2013-06-04 18 views
5

Ich habe eine ListView, die eine Grid mit zwei Spalten und vielen Zeilen hat. Jede Zeile hat eine TextBlock in jeder Spalte mit jeder Eigenschaft gebunden an einen Wert in ListView ItemSource. Ich muss eine Konvertierung des Textes in der zweiten TextBlock abhängig von dem Wert in der ersten TextBlock tun. Wie kann ich den Wert des ersten Textfelds zum Konverter bekommen? HierÜbergeben von Werten an IValueConverter

ist das, was ich bisher:

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> 

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

Antwort

5

Sie können nicht mehr als einen Wert an den "normalen" Wertkonverter übergeben. Sie könnten mit IMultiValueConverter gehen und die Bindung als MultiBinding definieren.

Oder Sie können einen IValueConverter erstellen, der das gesamte Objekt im DataContext übernimmt, das Objekt in seinen Typ umwandelt, den Wert und den Schlüssel übernimmt und die gewünschte Zeichenfolge zurückgibt. die Bindung als

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

Und Ihre Konverter als

Auf dem zweiten Textblock definieren:

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

Versuchen Multi-Bindung.

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

und leicht modifizierte XAML: Sie erhalten eine IMultiValueConverter brauchen

<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 zum Beispiel nicht die Eigenschaft (value in diesem Fall). Dann haben Sie Zugriff auf beide Key und Value im Konverter.

+0

Petar

Verwandte Themen