2010-04-18 5 views
0

관찰 가능 목록을 목록 상자 /보기와 동기화하려고하면이 문제가 발생합니다. 첫 번째 항목을 X 번 (목록의 전체 총 레코드 수) 표시합니다. 하지만 ' t 변수의 여기WPF ListBox/View 데이터 바인딩 이상한 결과

는 XAML

<ListBox x:Name="PostListView" BorderThickness="0" 
        MinHeight="300" 
        Background="{x:Null}" 
        BorderBrush="{x:Null}" 
        Foreground="{x:Null}" 
        VerticalContentAlignment="Top" 
        ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
        ScrollViewer.VerticalScrollBarVisibility="Disabled" 
       DataContext="{Binding Source={StaticResource PostListData}}" 
        ItemsSource="{Binding Mode=OneWay}" 
        IsSynchronizedWithCurrentItem="True" 
        MinWidth="332" SelectedIndex="0" SelectionMode="Extended" AlternationCount="1"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <DockPanel x:Name="SinglePost" VerticalAlignment="Top" ScrollViewer.CanContentScroll="True" ClipToBounds="True" Width="333" Height="70" d:LayoutOverrides="VerticalAlignment" d:IsEffectDisabled="True"> 
      <DockPanel.DataContext> 
       <local:PostList/> 
      </DockPanel.DataContext> 
      <StackPanel x:Name="AvatarNickHolder" Width="60"> 
          <Label x:Name="Nick" HorizontalAlignment="Center" Margin="5,0" VerticalAlignment="Top" Height="15" Content="{Binding Path=pUsername, FallbackValue=pUsername}" FontFamily="Arial" FontSize="10.667" Padding="5,0"/> 
       <Image x:Name="Avatar" HorizontalAlignment="Center" Margin="5,0,5,5" VerticalAlignment="Top" Width="50" Height="50" IsHitTestVisible="False" Source="1045443356IMG_0972.jpg" Stretch="UniformToFill"/> 
      </StackPanel> 
         <TextBlock x:Name="userPostText" Margin="0,0,5,0" VerticalAlignment="Center" FontSize="10.667" Text="{Binding Path=pMsg, FallbackValue=pMsg}" TextWrapping="Wrap"/> 
     </DockPanel> 
    </DataTemplate> 
      </ListBox.ItemTemplate> 
    </ListBox> 

이며, 여기에 ovservable리스트 클래스를

public class PostList : ObservableCollection<PostData> 
    { 
     public PostList() 
      : base() 
     { 
      Add(new PostData("this is test msg", "Cather", "1045443356IMG_0972.jpg")); 
      Add(new PostData("this is test msg1", "t1", "1045443356IMG_0972.jpg")); 
      Add(new PostData("this is test msg2", "t2", "1045443356IMG_0972.jpg")); 
      Add(new PostData("this is test msg3", "t3", "1045443356IMG_0972.jpg")); 
      Add(new PostData("this is test msg4", "t4", "1045443356IMG_0972.jpg")); 
      Add(new PostData("this is test msg5", "t5", "1045443356IMG_0972.jpg")); 
      // Add(new PostData("Isak", "Dinesen")); 
      // Add(new PostData("Victor", "Hugo")); 
      // Add(new PostData("Jules", "Verne")); 
     } 
    } 

    public class PostData 
    { 
     private string Username; 
     private string Msg; 
     private string Avatar; 
     private string LinkAttached; 
     private string PicAttached; 
     private string VideoAttached; 

     public PostData(string msg ,string username, string avatar=null, string link=null,string pic=null ,string video=null) 
     { 
      this.Username = username; 
      this.Msg = msg; 
      this.Avatar = avatar; 
      this.LinkAttached = link; 
      this.PicAttached = pic; 
      this.VideoAttached = video; 
     } 

     public string pMsg 
     { 
      get { return Msg; } 
      set { Msg = value; } 
     } 

     public string pUsername 
     { 
      get { return Username; } 
      set { Username = value; } 
     } 

     public string pAvatar 
     { 
      get { return Avatar; } 
      set { Avatar = value; } 
     } 

     public string pLink 
     { 
      get { return LinkAttached; } 
      set { LinkAttached = value; } 
     } 

     public string pPic 
     { 
      get { return PicAttached; } 
      set { PicAttached = value; } 
     } 

     public string pVideo 
     { 
      get { return VideoAttached; } 
      set { VideoAttached = value; } 
     } 
    } 

모든 ID입니다 변경 eas?

답변

1

템플릿을 만들 때마다 새 DataContext (PostList)를 만듭니다.

ListBox에서 ItemsSource를 새 PostList로 설정하십시오.

ListBox는 PostData의 각 인스턴스를 DataTemplate의 각 복사본에 할당하고 루트 요소의 DataContext로 설정합니다.

TL; DR :

<DockPanel.DataContext> 
    <local:PostList/> 
</DockPanel.DataContext> 
+0

좋은 답변을 제거하십시오, 감사합니다! – Aviatrix

+0

그리고 지금은 동기화되지 않습니다. 동적으로 항목을 추가하면 나타나지 않습니다. (초보자 : ( – Aviatrix

+1

@avia 아마도 컨트롤이 바인딩 된 PostList라고 생각하는 항목을 추가하고있을 것입니다 반대하지만 사실은 같은 인스턴스가 아닙니다. 나는 모든 것이 어떻게 작동 하는지를 배우기 위해 단일 ListBox를 단일 ObservableCollection에 바인딩하는 매우 간단한 프로젝트를 만드는 것이 좋습니다. – Will