2017-04-19 2 views
0

WPF에서 편집 가능한 셀을 사용하여 간단한 DataGrid를 만듭니다. 하지만 편집 된 셀에서 null 데이터가 나타납니다. WPF에서 초보자입니다. 문제가 무엇입니까?DataGrid의 편집 된 셀에서 null을 반환합니다.

폴더 셀을 변경하려고하면 표시된대로 변경됩니다. in the image.

이것은 result입니다!

코드,

namespace MyApp 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      List<Product> tmpProducts = new List<Product>(); 

      tmpProducts.Add(new Product { 
       id = 1, title = "Product A", folder = null, 
      }); 
      tmpProducts.Add(new Product { 
       id = 2, title = "Product B", folder = null, 
      }); 

      productGrid.ItemsSource = tmpProducts; 
     } 

     private void selectFolder(object sender, RoutedEventArgs e) 
     { 
      // selected folder from dialog, etc. then, 
      string selectedPath = "C:\\myFolder"; 

      object item = productGrid.SelectedItem; 
      (productGrid.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text = selectedPath; 
     } 

     private void updateProducts(object sender, RoutedEventArgs e) 
     { 
      for (int i = 0; i < productGrid.Items.Count; i++) 
      { 
       Product prd = (Product)productGrid.Items[i]; 
       Console.WriteLine(prd.folder); 
      } 
     } 
    } 


    class Product 
    { 
     public int id { get; set; } 
     public string title { get; set; } 
     public string folder { get; set; } 
    } 
} 
<Window x:Class="MyApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:MyApp" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid x:Name="productGrid" AutoGenerateColumns="False" CanUserAddRows="False" Margin="0,0,0,36"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding id}" Header="ID"/> 
       <DataGridTextColumn Binding="{Binding title}" Header="Title" Width="*"/> 
       <DataGridTextColumn Binding="{Binding folder}" Header="Foler" Width="*"/> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Button Click="selectFolder" Content="Browse.." Width="100"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

     <Button Click="updateProducts" Content="Save" HorizontalAlignment="Left" Margin="432,289,0,0" VerticalAlignment="Top" Width="75"/> 
    </Grid> 
</Window> 

답변

1

당신은 null로 제품의 "폴더"속성을 설정하는 경우 다음 당신은 결코 다시 설정되지 않습니다 . DataGridCell의 텍스트를 변경하는 중입니다. updateProducts 이벤트를 가져 오기 전에 제품의 폴더 속성도 설정해야합니다. 이처럼 : 새 값을 참조 할 수 있도록하기위한 것으로

private void selectFolder(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    Product product = btn.DataContext as Product; 
    string selectedPath = "C:\\myFolder"; 
    product.folder = selectedPath; 
} 

참고 :

private void selectFolder(object sender, RoutedEventArgs e) 
{ 
    // selected folder from dialog, etc. then, 
    string selectedPath = "C:\\myFolder"; 

    object item = productGrid.SelectedItem; 

    (item as Product).folder = selectedPath; //set the folder property of your Product item 

    (productGrid.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text = selectedPath; 
} 
+0

대단히 감사합니다. 지금 일하고있다. – empax

0

당신은 TextTextBlock의 속성을 설정하는 대신 해당 Product 개체의 folder 속성을 설정해야합니다 DataGrid에서 Product 클래스는 INotifyPropertyChanged 인터페이스를 구현하고 폴더 속성의 설정자에서 PropertyChanged 이벤트를 발생시켜야합니다.

class Product : INotifyPropertyChanged 
{ 
    public int id { get; set; } 
    public string title { get; set; } 

    private string _folder; 
    public string MyProperty 
    { 
     get { return _folder; } 
     set { _folder = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

고맙습니다. WPF에서 초보자입니다. MVVM 방식으로 시도해 보겠습니다. – empax

관련 문제