2010-11-03 8 views
0

Dans l'application wpf j'ai lié Dictionnaire à la liste. J'ai propre style sur la liste. élément de liste de liste consit image et 3 texblocks.WPF ListBoxItems problème

classe ami est ici:

public class FriendData 
{ 
    public string idUser { get; set; } 
    public string nick { get; set; } 
    public string sefNick { get; set; } 
    public string status { get; set; } 
    public string photo { get; set; } 
    public string sex { get; set; } 
    public string isFriend { get; set; } 

    public string blockQuote { get; set; } 

    public FriendData(string idUser, string nick, string sefNick, string status, string photo, string sex, string isFriend) 
    { 
     this.idUser = idUser; 
     this.nick = nick; 
     this.sefNick = sefNick; 
     this.status = status; 
     this.photo = photo; 
     this.sex = sex; 
     this.isFriend = isFriend; 
    } 
} 

style ListBox est ici:

<Style x:Key="friendsListStyle" TargetType="{x:Type ListBox}"> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Grid Name="MainGrid"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="0.3*"></ColumnDefinition> 
          <ColumnDefinition Width="*"></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="60"></RowDefinition> 
         </Grid.RowDefinitions> 
         <Image Source="{Binding Value.photo}" Margin="4,4,4,2"/> 
         <Grid Name="SlaveGrid" Grid.Column="1"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*"></ColumnDefinition> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*"></RowDefinition> 
           <RowDefinition Height="*"></RowDefinition> 
           <RowDefinition Height="*"></RowDefinition> 
          </Grid.RowDefinitions> 
          <TextBlock Name="tbName" Text="{Binding Value.nick}" Grid.Column="0" Grid.Row="0" Margin="2,2,2,2" FontSize="13" FontWeight="Medium"></TextBlock> 
          <TextBlock Name="tbBlockQuote" Text="{Binding Value.blockQuote}" Grid.Column="0" Grid.Row="1" Margin="2,2,2,2" FontSize="11" FontWeight="Normal" Foreground="DarkGray"></TextBlock> 
          <TextBlock Name="tbStatus" Text="{Binding Value.status}" Grid.Column="0" Grid.Row="2" Margin="2,2,2,2" FontSize="11" FontWeight="Normal"></TextBlock> 
         </Grid> 
        </Grid> 
        <DataTemplate.Triggers> 
         <!--<Trigger Property="IsMouseOver" Value="true"> 
          <Setter Property="LayoutTransform" TargetName="MainGrid"> 
           <Setter.Value> 
            <ScaleTransform ScaleX="1.35" ScaleY="1.35" /> 
           </Setter.Value> 
          </Setter> 
         </Trigger>--> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Mon premier problème est, tbStatus est binded au statut de propriété ami de classe. Le statut peut avoir seulement 3 valeurs: 0,1,2. Si le statut a la valeur 0, j'ai besoin de mettre tbStatus.Text = "Offline", si l'état a la valeur 1, j'ai besoin de tbStatus.Text = "Online" et si le status est 2 alors tbStatus.Text = "Just Log". Est-il possible que cette condition soit définie à partir de XAML dans le style listBox? Mon deuxième problème est si l'état est 0, j'ai besoin convertir l'image en niveaux de gris. J'ai la fonction qui convertit en niveaux de gris. Je voudrais définir ces conditions dans le style listBox. Toute avance?

Voici:

private void ConvertImageToGrayScaleImage(string uri) 

{ 

    Image grayImage = new Image(); 

    BitmapImage bmpImage = new BitmapImage(); 

    bmpImage.BeginInit(); 

    bmpImage.UriSource = new Uri(uri); 

    bmpImage.EndInit(); 

    FormatConvertedBitmap grayBitmap = new FormatConvertedBitmap(); 

    grayBitmap.BeginInit(); 

    grayBitmap.Source = bmpImage; 

    grayBitmap.DestinationFormat = PixelFormats.Gray8; 

    grayBitmap.EndInit(); 

    grayImage.Source = grayBitmap; 

    LayoutRoot.Children.Add(grayImage); 

} 
+0

Ceci est beaucoup de code, et très peu de question. Pouvez-vous couper le code jusqu'à ce que vous ayez un ensemble minimal qui reproduit le problème? –

Répondre

1

Dans les deux cas, votre meilleur pari est d'écrire un IValueConverter.

Par exemple, voici un pour convertir votre texte:

public class StatusToTextConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int status = Int32.Parse(value.ToString()); 
     switch (status) 
     { 
      case 0: 
       return "Offline"; 

      case 1: 
       return "Online"; 

      case 2: 
       return "Just Log"; 
     } 

     return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string status = value.ToString(); 
     switch (status) 
     { 
      case "Offline": 
       return 0; 

      case "Online": 
       return 1; 

      case "Just Log": 
       return 2; 
     } 

     return Binding.DoNothing; 
    } 
} 

Et votre texte contraignant devient (après avoir ajouté la référence dans une section Ressources appropriée de votre XAML):

<TextBlock Name="tbStatus" 
      Text="{Binding Value.status, 
          Converter={StaticResource statusToText}}" 
      Grid.Column="0" 
      Grid.Row="2" 
      Margin="2,2,2,2" 
      FontSize="11" 
      FontWeight="Normal"></TextBlock> 

I Je vais vous laisser le convertisseur d'image, puisque c'est un élément de base, et ce serait essentiellement une répétition de ce code. Notez qu'il s'agit de valeurs codées en dur, ce qui n'est pas vraiment une meilleure pratique. Vous devriez probablement utiliser des énumérations, ainsi que des ressources (au lieu de chaînes codées en dur) si vous envisagez de localiser cette application.

+0

Merci beaucoup, votre avance est très utile pour moi, je suis débutant dans WPF. Passez une bonne journée – Tom

+0

@Tom - pas de problème. FYI - J'ai remarqué que vous n'avez pas marqué de réponses à vos questions en guise de réponses (bien que vous ayez très bien pu les classer, ce qui est bien). Si les réponses données à vos questions vous ont réellement aidé à résoudre les problèmes, cochez la case en guise de réponse - lorsque vous posez plus de questions, les gens peuvent être plus disposés à vous répondre si vous avez une réputation positive. –