2017-04-19 8 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

関連する問題