2010-12-05 10 views
0

하나의 열에 텍스트 상자가있는 목록보기가 있습니다. Listview는 IEnumerable 컬렉션에 바인딩됩니다. 텍스트 상자의 텍스트를 편집하고 확인을 누르면 바인딩 된 컬렉션의 원래 값만 있습니다.
나는 listview를 스누핑하고 텍스트 상자의 변경 사항을 listviewitem의 객체에 표시하며 listview는 화면에 표시되지만 OK 버튼 핸들러에서는 모두 사라진 것을 볼 수 있습니다. 나는이 문제를 발견Wpf Listview 바운드 개체가 변경되지 않았습니다.

<Grid> 
    <ListView HorizontalAlignment="Stretch" Margin="0,38,0,0" Name="lvPayee" 
         VerticalAlignment="Stretch" GridViewColumnHeader.Click="lvPayee_Click" Background="AliceBlue"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn Header="Listed" Width="60"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Margin="15,0,0,0" IsChecked="{Binding Listed}"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Payee" Width="425"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate DataType="{x:Type TextBox}"> 
           <TextBox Width="420" Text="{Binding Name}" Background="Transparent"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Use Count" Width="80" DisplayMemberBinding="{Binding UseCount}"/> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <CheckBox Content="Listed Only" Height="27" HorizontalAlignment="Left" Margin="57,12,0,0" Name="cbListedOnly" VerticalAlignment="Top" Width="129" IsChecked="True" Click="Listed_Clicked" /> 
    <Button Content="OK" Height="27" HorizontalAlignment="Left" Margin="381,6,0,0" Name="btnOK" VerticalAlignment="Top" Width="89" Click="OK_Clicked" /> 
    <Button Content="Cancel" Height="27" HorizontalAlignment="Left" Margin="493,6,0,0" Name="btnCancel" VerticalAlignment="Top" Width="80" IsCancel="True" /> 
</Grid> 


public partial class PayeeManager : Window 
{ 
    private IEnumerable<Payee> payees = null; 
    private IEnumerable<Payee> payto = null; 
    private bool reverse = false; 
    private string lastColumn = ""; 

    public PayeeManager(Window owner, IEnumerable<Payee> payees) 
    { 
     this.Owner = owner; 
     this.payees = payees; 
     InitializeComponent(); 

     payto = from p in this.payees 
         where p.Listed == true 
         orderby p.Name 
         select p; 

     lvPayee.ItemsSource = payto; 
    } 

    public class Payee 
    { 
     public string Name { get; set; } 
     public int UseCount { get; set; } 
     public bool Listed { get; set; } 

     public string OldName { get; set; } 
     public bool OldListed { get; set; } 
    } 

    private void Listed_Clicked(object sender, RoutedEventArgs e) 
    { 
     payto = from p in this.payees 
         where cbListedOnly.IsChecked == true ? p.Listed == true : true 
         select p; 

     lvPayee.ItemsSource = payto; 
    } 

    private void lvPayee_Click(object sender, RoutedEventArgs e) 
    { 
     if (!(e.OriginalSource is GridViewColumnHeader)) return; 

     string header = (string)((GridViewColumnHeader)e.OriginalSource).Column.Header; 
     if (lastColumn != header) 
     { 
      lastColumn = header; 
      reverse = false; 
     } 
     else reverse = !reverse; 

     switch (header) 
     { 
      case "Listed": 
        payto = from p in this.payees 
            where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1 
            orderby p.Listed 
            select p; 
       break; 
      case "Payee": 
        payto = from p in this.payees 
            where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1 
            orderby p.Name 
            select p; 
       break; 
      case "Use Count": 
        payto = from p in this.payees 
            where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1 
            orderby p.UseCount 
            select p; 
       break; 
      default: 
       return; 
     } 
     if (reverse) payto = payto.Reverse(); 
     lvPayee.ItemsSource = payto; 
    } 

    private void OK_Clicked(object sender, RoutedEventArgs e) 
    { 
     DialogResult = true; 
    } 
} 
+0

'어디서!! cbListedOnly.IsChecked || p.Listed' – SLaks

+0

당면한 문제와 관련이 없습니다. 문제는이 창에서 발신자에게 변경 사항을 가져 오는 방법입니다. – Vadim

답변

0

:

여기 (수취인은 윈도우의 호출에 의해 생산 LINQ - 투 - XML ​​쿼리의 결과입니다) 윈도우의 XAML과 코드 숨김입니다. 내가 listview의 ItemSource Linq 쿼리로 사용하고 액세스 할 때 새로 고쳐지고 변경 사항이 손실되었습니다. ItemSource를 List로 변경하고 ToList()를 쿼리에 사용하면 현재 작동합니다.