2010-11-03 64 views
0

在wpf應用程序中,我將Dictionary綁定到了列表框。我在列表框上有自己的風格。 列表框項目consit圖像和3個texblocks。WPF ListBoxItems問題

朋友類是在這裏:

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

ListBox的風格是在這裏:

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

我的第一個問題是,tbStatus被綁定到類朋友的財產狀況。狀態只能有3個值:0,1,2。如果狀態值爲0,則需要設置tbStatus.Text =「Offline」,如果狀態值爲1,則需要設置tbStatus.Text =「Online」,如果狀態爲2,則必須爲tbStatus.Text =「Just Log」。從列表框樣式中的XAML設置這個條件可能嗎?

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

我的第二個問題是,如果狀態爲0,我需要將圖像轉換爲灰度。我有func將轉換爲灰度。我想在listBox風格中設置這些條件。任何進展?

這裏是:

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

這是很多代碼,而且很少有問題。你可以修剪代碼,直到你有一個最小的集合來重現問題嗎? – 2010-11-03 19:58:34

回答

1

在這兩種情況下,最好的辦法是寫一個IValueConverter

舉例來說,這裏是一個將你的文字:

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

而且你的文字結合成爲(在你的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> 

我將把圖像轉換器留給你,因爲這是基本的東西,並且它基本上是這個代碼的重複。

請注意,這是硬編碼值,這不是最佳實踐。如果您打算本地化此應用程序,則應該使用枚舉以及資源(而不是硬編碼的字符串)。

+0

非常感謝,您對我的幫助很大,我是WPF的新手。祝你有美好的一天 – Tom 2010-11-03 20:59:25

+0

@Tom - 沒問題。僅供參考 - 我注意到,你沒有標記任何回答你的問題作爲答案(儘管你可能已經投了票,這很好)。如果回答問題的答案確實幫助您解決了問題,請選中該複選標記作爲答案 - 當您提出更多問題時,如果您有良好的聲譽,人們可能更願意給出答案。 – 2010-11-04 02:03:41