2013-04-01 6 views
0

У меня есть окна добавления фильма:WPF добавить DataGrid строки из другого окна

private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      string name = txtName.Text; 
      string genre = txtGenre.Text; 
      bool dubbed = checkBox1.IsChecked.Value; 
      bool is3d = checkBox2.IsChecked.Value; 
      MessageBox.Show(name + " " + genre); 
      var main = new MainWindow(); 
      main.CallbackAddMovie(name, genre, dubbed, is3d); 
      this.Close(); 
     } 

И обратный вызов:

public class DataItem 
     { 
      public string name { get; set; } 
      public string genre { get; set; } 
      public bool dubbed { get; set; } 
      public bool is3d { get; set; } 
     } 

     public void CallbackAddMovie(string mname, string mgenre, bool mdubbed, bool mis3d) 
     { 
      dataGrid1.Items.Add(new DataItem { name = "Movie name2", genre = "Action", dubbed = true, is3d = true }); 
      dataGrid1.Items.Add(new DataItem { name = mname, genre = mgenre, dubbed = mdubbed, is3d = mis3d }); 
      dataGrid1.SelectAll(); 
     } 

Когда я добавить фильм, я получаю окно сообщения, но и DataGrid вон В нем есть новые элементы. Что такое worng?

EDIT:
Вот мое творение DataGrid:

var colname = new DataGridTextColumn(); 
      colname.Header = "Name"; 
      colname.Binding = new Binding("name"); 
      dataGrid1.Columns.Add(colname); 

      var colgenre = new DataGridTextColumn(); 
      colgenre.Header = "Genre"; 
      colgenre.Binding = new Binding("genre"); 
      dataGrid1.Columns.Add(colgenre); 

      var coldubbed = new DataGridCheckBoxColumn(); 
      coldubbed.Header = "Dubbed"; 
      coldubbed.Binding = new Binding("dubbed"); 
      dataGrid1.Columns.Add(coldubbed); 

      var col3d = new DataGridCheckBoxColumn(); 
      col3d.Header = "3D"; 
      col3d.IsReadOnly = true; 
      col3d.Binding = new Binding("is3d"); 
      dataGrid1.Columns.Add(col3d); 


      // create and add two lines of fake data to be displayed, here 
      dataGrid1.Items.Add(new DataItem { name = "Movie name", genre = "Action", dubbed = true, is3d = true }); 

EDIT:
Полный проект:
MainWindow.cs:
http://pastebin.com/Xrr6DjuH MainWindow.xaml:
http://pastebin.com/SJS4akU4 AddMovie:
http://pastebin.com/J7C5ub8N

+0

показать код XAML для сетки данных, пожалуйста, –

+0

@AntonSemenov, я добавил его. – funerr

+0

@ agam360 чувак ваш код ужасен. Изучите MVVM. Не используйте WPF, как если бы это были winforms. –

ответ

2

Вместо добавления элементов непосредственно к сетке с помощью Items.Add(), вы должны создать коллекцию, как List<> или ObservableCollection<> и назначить его в качестве источника данных в DataGrid. Затем вместо добавления нового DataItem к datagrid просто добавьте новый объект в источник данных, и сетка будет автоматически обновляться.

WPF предназначен для использования в шаблоне MVC, и вы используете его больше как WinForms.

EDIT: Вот пример, который показывает, как WPF будет работать в этой ситуации

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 

    ObservableCollection<ListObject> _listDatasource; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     _listDatasource = new ObservableCollection<ListObject>(); 
     listView1.ItemsSource = _listDatasource; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     AddWindow winAdd = new AddWindow(); 
     winAdd.AddItem += new AddItemHandler(winAdd_AddItem); 
     winAdd.Show(); 
    } 

    void winAdd_AddItem(object sender, ListObject itemToAdd) 
    { 
     _listDatasource.Add(itemToAdd); 
    } 
} 

MainWindow.xaml

<Grid> 
     <ListView Height="163" HorizontalAlignment="Left" Margin="34,56,0,0" Name="listView1" VerticalAlignment="Top" Width="322" > 
      <ListView.View> 

       <GridView x:Name="gridList" > 
        <GridViewColumn x:Name="colValue" DisplayMemberBinding="{Binding Path=ListValue}" Header="Value" /> 

       </GridView> 
      </ListView.View> 
     </ListView> 
     <Button Content="Open Add Window" Height="23" HorizontalAlignment="Left" Margin="47,27,0,0" Name="button1" VerticalAlignment="Top" Width="177" Click="button1_Click" /> 
    </Grid> 

AddWindow.xaml

<Grid> 
     <TextBox Height="23" HorizontalAlignment="Left" Margin="57,71,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" /> 
     <Label Content="Add this:" Height="28" HorizontalAlignment="Left" Margin="57,46,0,0" Name="label1" VerticalAlignment="Top" /> 
     <Button Content="Add it" Height="23" HorizontalAlignment="Left" Margin="102,114,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    </Grid> 

AddWindow.xaml.cs

public delegate void AddItemHandler(object sender, ListObject itemToAdd); 

    public partial class AddWindow : Window 
    { 
     public event AddItemHandler AddItem; 
     public AddWindow() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      ListObject itemToAdd = new ListObject(); 
      itemToAdd.ListValue = textBox1.Text; 
      AddItem(this, itemToAdd); 
     } 
    } 

ListObject.cs

public class ListObject 
    { 
     private string _listValue; 

     public string ListValue 
     { 
      get { return _listValue; } 
      set { _listValue = value; } 
     } 
    } 
+0

Мне нужно создать что-то быстрое и грязное (это первый раз с использованием wpf). почему мой код не работает? и можете ли вы привести свой пример?(также я думаю, что мой код может не работать, потому что он выполняется из другой формы) – funerr

+0

Обмен данными между двумя различными формами - это то же самое, что и обмен данными между двумя разными классами. «Быстрое и грязное» решение - это то, что я вам дал. Как только вы познакомитесь с WPF, вы поймете, что я имею в виду. – jugg1es

+0

Есть ли какой-либо пример такой привязки? – funerr

Смежные вопросы