【问题标题】:WPF - Observablecollection binded DataGrid not updating when i add item from other windowWPF - 当我从其他窗口添加项目时,Observablecollection 绑定的 DataGrid 没有更新
【发布时间】:2016-06-02 08:41:42
【问题描述】:

这是我第一次使用 WPF。我已经看到了很多问题,但无法得到正确的答案。场景是我有由 ViewModel 实现的订单 ObservableCollection。这是代码

namespace WpfApplication2.ViewModels
{
public class ViewModel : ObservableCollection<Order>
{
  static ObservableCollection<Order> orderlist = new ObservableCollection<Order>();

    public ParameterCommand ParameterCommand { get; set; }

    public ViewModel()
    {
        this.ParameterCommand = new ParameterCommand(this);
        for (int i = 0; i < 10; i++)
        {
             Order o = new Order();
             o.Imei = "Person"+ i;
             o.price = i*20;
             o.Cust_ID = i;


             Add(o);
        }

    }



    public void ParameterMethod(Order order)
    {
        Order o = new Order();
        o.Imei = order.Imei;
        o.price = order.price;
        o.Cust_ID = order.Cust_ID;


        Add(o);

    }
}
}

现在我有了主窗口,上面的视图模型绑定了 Datagrid MainWindow.xaml

 <Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:view ="clr-namespace:WpfApplication2"
    xmlns:model="clr-namespace:WpfApplication2.ViewModels"
    Title="MainWindow" Height="359.388" Width="630.791">
<Window.Resources>
    <view:Order x:Key="order"></view:Order>
    <model:ViewModel x:Key="modelview"/>  

    </Window.Resources>

<Grid DataContext="{Binding Source={StaticResource modelview}}" >
    <DataGrid HorizontalAlignment="Left"  AutoGenerateColumns="False"  Margin="48,26,0,0" DataContext="{Binding Source={StaticResource modelview}}" ItemsSource="{Binding}"  VerticalAlignment="Top" Height="235" Width="373">
        <DataGrid.Columns>
            <DataGridTextColumn  Header="Name"  Binding="{Binding Imei,Mode=TwoWay}"/>
            <DataGridTextColumn  Header="Cutomer ID"  Binding="{Binding Cust_ID,Mode=TwoWay}"/>
            <DataGridTextColumn  Header="Price"  Binding="{Binding price,Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>


    <TextBox HorizontalAlignment="Left" Height="23" DataContext="{Binding Source={StaticResource order}}" Margin="490,69,0,0" Text="{Binding Path=Imei, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="TextBox_TextChanged_1"/>
    <TextBox HorizontalAlignment="Left" Height="23" DataContext="{Binding Source={StaticResource order}}" Margin="490,119,0,0" Text="{Binding Path=Cust_ID, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox HorizontalAlignment="Left" Height="23" DataContext="{Binding Source={StaticResource order}}" Margin="490,165,0,0" Text="{Binding Path=price, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>


    <Button Content="NEW" HorizontalAlignment="Left" Margin="109,276,0,0" VerticalAlignment="Top" Width="99" Command="{Binding ParameterCommand, Source={StaticResource modelview}}" CommandParameter="{Binding Source={StaticResource order}}"  Height="25"/>
    <Button Content="NEW" HorizontalAlignment="Left" Margin="239,276,0,0" VerticalAlignment="Top" Width="99" Height="25" Click="Button_Click_1"/>

</Grid>

现在,当我将主窗口文本框中的值添加到 ObservableCollection 时,它会在数据网格中更新,但是当我使用其他单独的窗口在 ObservableCollection 中添加项目时,它会被添加到其中,但数据网格没有更新。你能帮帮我吗 编辑: 这是我将项目添加到 ObservableCollection 的窗口的 xaml

    Title="New" Height="300" Width="300">

<Window.Resources>
    <view:Order x:Key="order"></view:Order>
    <model:ViewModel x:Key="modelview"/>

</Window.Resources>
<Grid>
    <TextBox HorizontalAlignment="Left" Text="{Binding Path=Imei, Mode=TwoWay}"  Height="23" Margin="83,30,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox HorizontalAlignment="Left" Text="{Binding Path=Cust_ID, Mode=TwoWay}" Height="23" Margin="83,85,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox HorizontalAlignment="Left" Text="{Binding Path=price, Mode=TwoWay}" Height="23" Margin="83,136,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <Button Content="Save to grid" HorizontalAlignment="Left" Margin="104,196,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ParameterCommand, Source={StaticResource modelview}}" CommandParameter="{Binding Source={StaticResource order}}"/>

</Grid>

如果出现任何问题,还会附加命令

namespace WpfApplication2.ViewModels.Commands
{
  public class ParameterCommand : ICommand
  {

    public ViewModel ViewMod
    {
        get ;
        set ;
    }

    public ParameterCommand(ViewModel view)
    {
        this.ViewMod = view;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        this.ViewMod.ParameterMethod(parameter as Order);
    }
  }
}

添加 主窗口.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {

        InitializeComponent();
        //ViewModel vm = new ViewModel();
        //this.DataContext = vm;

    }


   private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        New win = new New();
        win .Owner = this;
        win .DataContext = this.DataContext;
        win .Show();
    }
}

【问题讨论】:

  • 为什么在 NewWindow 中使用 Resources ?我认为它们根本不需要。
  • @AnjumSKhan Command="{Binding ParameterCommand, Source={StaticResource modelview}}" CommandParameter="{Binding Source={StaticResource order}} 使用资源绑定到按钮命令

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

这是因为您在新的window 中创建了ViewModel 的新对象,并将数据用作DataContext。试试下面的代码:

Window w = new Window();
w.DataContext = this.DataContext;
w.Show();

当您打开新的window 时,使用当前的DataContext 实例作为新窗口的DataContext。而且你的代码可以正常工作。

更新

从你New Window删除下面的部分。

<Window.Resources>
    <view:Order x:Key="order"></view:Order>
    <model:ViewModel x:Key="modelview"/>
</Window.Resources>

&lt;model:ViewModel x:Key="modelview"/&gt; 的原因是 ViewModel 的新对象正在使用 New Window 创建。

如下更改您的Command

<Button Content="Save to grid" HorizontalAlignment="Left" Margin="104,196,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ParameterCommand}" CommandParameter="{Binding Source={StaticResource order}}"/>

不确定您想在CommandParameter 中做什么。但是你的新 窗口将现有的ViewModel 对象作为DataContextCommand可以直接绑定Button

【讨论】:

  • 仍在创建viewmodel的新对象
  • @ZainAwais 你是如何推断或得出结论的?
  • @ZainAwais 您是否从新窗口中删除了 DataContext="{Binding Source={StaticResource order}}" 代码?将 DataContext 提供给 window 后就不需要了。
  • 在新窗口的初始化组件上使用了调试。它再次进入构造函数并对其进行初始化。下面附上代码
  • 请查看更新后的问题并帮助我在哪里出错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2018-04-06
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多