【问题标题】:WPF add datagrid row from other windowWPF从其他窗口添加数据网格行
【发布时间】:2013-04-01 18:33:39
【问题描述】:

我有一个添加电影窗口:

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

当我添加电影时,我会看到消息框,但数据网格中不会包含新项目。 穿什么?

编辑:
这是我创建的数据网格:

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

编辑:
完整项目:
MainWindow.cs:
http://pastebin.com/Xrr6DjuH MainWindow.xaml:
http://pastebin.com/SJS4akU4 添加电影:
http://pastebin.com/J7C5ub8N

【问题讨论】:

  • 请显示您的数据网格的 xaml 代码
  • @AntonSemenov,我已经添加了。
  • @agam360 老兄,你的代码太可怕了。学习 MVVM。不要像使用 Winform 一样使用 WPF。
  • 您的代码与 WPF 的意识形态相矛盾,但它是有效的代码,它应该可以工作。你确定只调用一次创建代码吗?
  • @AntonSemenov,是的,您想在 paste bin 上查看整个项目吗?

标签: c# wpf wpfdatagrid


【解决方案1】:

您应该创建一个集合,如List<>ObservableCollection<>,而不是使用Items.Add() 将项目直接添加到数据网格,并将其指定为数据网格的数据源。然后不用向数据网格添加新的DataItem,只需向数据源添加一个新对象,网格就会自动更新。

WPF 旨在用于 MVC 模式,您使用它更像是 WinForms。

编辑:这是一个示例,显示 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; }
        }
    }

【讨论】:

  • 我需要创建一些又快又脏的东西(这是第一次使用 wpf)。为什么我的代码不起作用?你能举个例子吗? (我也认为我的代码可能不起作用,因为它是从另一种形式执行的)
  • 在两个不同的表单之间共享数据与在两个不同的类之间共享数据是一回事。 “快速而肮脏”的解决方案是我给你的解决方案。一旦你熟悉了 WPF,你就会明白我的意思。
  • 有这种绑定的例子吗?
猜你喜欢
  • 2014-11-06
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2012-10-08
  • 2021-11-15
  • 2011-01-04
相关资源
最近更新 更多