2013-06-04 5 views
5

나는 이고 두 열과 행이 많은 Grid입니다. 각 행은 각 열에 TextBlock을 가지고 있으며 각 Text 속성은 ListView의 의 값에 바인딩됩니다. 첫 번째 TextBlock의 값에 따라 두 번째 TextBlock의 텍스트를 변환해야합니다. 첫 번째 텍스트 상자의 값을 변환기로 가져 오는 방법은 무엇입니까? 여기 값을 IValueConverter로 전달

는 내가 지금까지 무엇을 가지고 :

XAML : ValueStringConverter

<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> 

코드 :

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

당신은 "일반적인"값 계산기에 하나 개 이상의 값을 전달할 수 없습니다 :

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 : 당신은 IMultiValueConverter가 필요합니다. IMultiValueConverter으로 가서 바인딩을 MultiBinding으로 정의 할 수 있습니다.

또는 DataContext에서 전체 개체를 가져 와서 해당 형식으로 개체를 캐스팅하고 Value 및 Key를 가져 와서 필요한 문자열을 반환하는 IValueConverter를 만들 수 있습니다. (이 경우 value)이 아닌 재산, 인스턴스에

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

하는 다중 결합 해보십시오.

<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

바인딩 : 두 번째 TextBlock의에

는 등을

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

으로 바인딩 및 컨버터를 정의합니다. 그러면 컨버터에서 KeyValue에 액세스 할 수 있습니다.

+0

Petar