2017-04-19 51 views
0

我使用WPF中的可編輯單元格創建了一個簡單的DataGrid。但我從編輯的單元格獲取空數據。我是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

你設置你的產品爲空「文件夾」屬性,然後你永遠不會再設置。您只是更改DataGridCell的文本。在嘗試在updateProducts事件中獲取產品之前,您還需要設置產品的文件夾屬性。就像這樣:

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

你應該設置相應的Product對象的folder屬性,而不是設置TextBlockText屬性:

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

注意,爲了讓您能夠看到新的價值在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