2012-07-18 87 views
0

我正在學習使用listBox在WPF中使用dataTemplate使用MSDN中的示例,我可以呈現綁定到ObservableCollection作爲源的列表框和重寫ToString方法。listBox DataTemplate沒有拾取值

但是,我需要爲每個項目渲染圖像和一些texblock。這是我的XAML:

<Grid x:Class="MyAddin.WPFControls" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:c="clr-namespace:MyAddin" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      Background="Transparent" 
      HorizontalAlignment="Stretch" Width="auto" 
      Height="215" VerticalAlignment="Stretch" ShowGridLines="False"> 
    <Grid.Resources> 
     <c:People x:Key="MyFriends"/> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <TextBlock HorizontalAlignment="Left" 
       IsManipulationEnabled="True" 
       Height="20" Width="300">Activity Feed</TextBlock> 
    <ListBox Grid.Row="1" Name="listBox1" IsSynchronizedWithCurrentItem="True" 
      BorderThickness="0" ScrollViewer.VerticalScrollBarVisibility="Auto" 
      VerticalContentAlignment="Stretch" Margin="0,0,0,5" Background="Transparent"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="60"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <Border Margin="5" BorderBrush="Black" BorderThickness="1"> 
         <Image Source="{Binding Path=Avatar}" Stretch="Fill" Width="50" Height="50" /> 
        </Border> 
        <StackPanel Grid.Column="1" Margin="5"> 
         <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold" > 
          <TextBlock Text="{Binding Path=Firstname }" /> 
         </StackPanel> 
         <TextBlock Text="{Binding Path=Comment}" /> 
        </StackPanel> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

我的集合類是如下:

public class People : ObservableCollection<Person> 
{ }   

public class Person 
{ 
    private string firstName; 
    private string comment; 
    private Bitmap avatar; 

    public Person(string first, string comment, Bitmap avatar) 
    { 
     this.firstName = first; 
     this.comment = comment; 
     this.avatar = avatar; 
    } 

    public string FirstName 
    { 
     get { return firstName; } 
     set { firstName = value; } 
    } 

    public string Comment 
    { 
     get { return comment; } 
     set { comment = value; } 
    } 

    public Bitmap Avatar 
    { 
     get { return avatar;} 
     set { avatar = value; } 
    } 

    public override string ToString() 
    { 
     return firstName.ToString(); 
    } 
} 

一旦我的插件加載,我下載我的數據和設置的ItemsSource。

People p = new People(); 
p.Add(new Person("Willa", "Some Comment", myAvatar)); 
p.Add(new Person("Isak", "Some Comment", myAvatar)); 
p.Add(new Person("Victor", "Some Comment", myAvatar)); 

this.wpfControl.listBox1.ItemsSource = p; 

我面臨的問題是,該項目被渲染爲,而如果我刪除的DataTemplate中,項目呈現的罰款與他們的firstName空行。

+0

如果您的人員類別應該是不可變的,那麼您應該做幾件事:擺脫屬性設置者,使字段爲「只讀」。如果它不是不可變的,你應該實現['INPC'](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx),以便在UI中獲取更改。 – 2012-07-18 12:38:46

回答

0

看不出什麼毛病綁定本身,而是你的頭像類型似乎斷,WPF預計ImageSource(我不知道是否有位圖和ImageSource之間的任何隱含的皈依,檢查binding errors來查找出來)。

+0

原來這是一個拼寫錯誤!我輸入名字而不是名字。對於不兼容類型的頭像,你也是對的。由於我的JSON數據包含了頭像的URL,因此我只需將圖像的Source屬性設置爲:) – Abhi 2012-07-18 14:03:57