c# - WPF - 当我从其他窗口添加项目时,Observablecollection 绑定(bind)的 DataGrid 没有更新

标签 c# wpf xaml mvvm datagrid

这是我第一次使用 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);

    }
}
}

现在我有了主窗口,上面的 View 模型绑定(bind)了 Datagrid
主窗口.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();
    }
}

最佳答案

这是因为您正在创建 ViewModel 的新对象在新 window并将数据用作 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>
<model:ViewModel x:Key="modelview"/>的原因| 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}}"/>

Not sure what are you trying to do in CommandParameter. But your New Window is getting existing ViewModel object as DataContext. Command can be directly bound to Button.

关于c# - WPF - 当我从其他窗口添加项目时,Observablecollection 绑定(bind)的 DataGrid 没有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35527940/

相关文章:

c# - .NET 6 发布 Android 应用程序

c# - 响应正文 json 包含转义字符串

c# - 有没有办法刷新 WPF 中的所有绑定(bind)?

c# - 以编程方式将 TextBlock 添加到 DataTemplate

Windows-10 UWP 将图像 url 绑定(bind)到 ListView 中的图像源

wpf - 如何从网格的样式设置网格中任何子元素的前景色?

c# - 隐藏的 ASP/C# 代码无法从标记获得控制

c# - MongoDB C# 单声道

c# - 样式应用不正确

c# - 如何使用MVVM媒体元素移至下一首歌曲