WPF: Converter (Wert-> Farbe) in einem Grid Control?



  • Hallo,

    sorry für die viele threads aber im netz finde ich oft nur Code schnippsel und nich explizit die Problematik

    ich habe ein ListView an eine DateViewModel gebunden was auch funktioniert:

    <ListView ItemsSource="{Binding ParameterList}"									SelectedItem="{Binding ElementName=root, Path=SelectedRecipeParameter}"								MouseDoubleClick="ListView_MouseDoubleClick">
    									<ListView.View>									<GridView>									<GridView.Columns>	
    									<!--Column description-->										<GridViewColumn DisplayMemberBinding="{Binding Description}">										<GridViewColumn.Header>											<GridViewColumnHeader Content="Description"/>										</GridViewColumn.Header>								</GridViewColumn>	
    
    .
    .....					
    <ListView/>
    

    nun will ich nen Converter einsetzen welcher den Hintergrund einer Zeile des ListView Control rot markieren lässt wenn best. Bedingungen vorhanden sind!

    Mein Converter:

    [ValueConversion(typeof(Brush), typeof(bool))]
    	public class BoolColorConverter : IValueConverter
    	{
    	//	public Color Default { get; set; }
    
    		#region IValueConverter Member
    
    		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			return ((bool)value == true) ? Color.Yellow : Color.Red;// default(Color);
    		}
    
    		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			throw new NotImplementedException();
    		}
    
    		#endregion
    	}
    

    Converter als ressource hinzufügen

    <Grid.Resources>
    
    <profile:BoolColorConverter x:Key="boolColorConverter"></profile:BoolColorConverter>
    
    </Grid.Resources>
    

    Aber wie binde ich nun den Converter an das Listview bzw. Rows, so das sie entsprechend einer bool Proterty des Viemodels "IsValid"??



  • ueber n style:

    <Style x:Key="ColoredRow" TargetType="{x:Type ListViewItem}">
        <Setter Property="Background">
            <Setter.Value>
                <Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource boolColorConverter}"/>
            </Setter.Value>
        </Setter>
    </Style>
    
    <ListView ... ItemContainerStyle="{StaticResource ColoredRow}" >
    

    in diesem beispiel bekommt der converter das komplette viewmodel - da kann man dann direkt IsValid ab fragen
    evtl kann man das binding n bissl anpassen um direkt das property zu uebergeben (das snippet ist aus einer app von mir das ich vor n jahr mal schrieb)



  • Wo kommt das en rein ?

    <ListView ... ItemContainerStyle="{StaticResource ColoredRow}" >
    

    Der Code in dem ich das einbauen muss, ist nich von mir.. und 100% verstanden ahb ich alles noch net, köntest du mir vll noch nen tipp geben?



  • das style brauchst du einfach nur in resourcen mit der entsprechenden sichtbarkeit
    dh entweder in den resources von der listview selber oder elemente darueber

    und das benutzen dann einfach in der listview hinzu fuegen und das wars
    und wie gesagt, das binding koennte man vieleicht noch etwas anpassen



  • ok gut, aber woher weis der converter bzw. das Binding das ich "IsValid" als quelle verwenden will?



  • in den beispiel wird das komplette viewmodel gebunden

    <Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource boolColorConverter}"/>

    dh in deinem Converter wird dann value vom typen deines list item viewmodels sein



  • Ahh ok , aber dann muss ich hier den code anpassen oder:

    [ValueConversion(typeof(Brush), typeof(/*MEINEVIEMODELKLASSE*/))]
        public class BoolColorConverter : IValueConverter
        {
    ....
    }
    

    oder ist das ValueConversion Attribute nichtmehr notwendig?



  • genau

    ob du das mit dem attribut machst ist dir ueberlassen - ich selber benutz das nie


Anmelden zum Antworten