【问题标题】:WPF Datagrid does not updateWPF Datagrid 不更新
【发布时间】:2018-12-03 06:06:43
【问题描述】:

我有一个(很可能)非常简单的问题,关于我绑定到 ObservableCollection 的 WPF 数据网格,不幸的是,当我将项目添加到此集合时它没有更新。

这是我的观点,包括。数据网格:

<UserControl.Resources>
    <local:SinglePackTransactions_ViewModel x:Key="vm"/>
</UserControl.Resources>
...
...
...
    <DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="700" Margin="30"
                      ItemsSource="{Binding SinglePackResultList, Source={StaticResource vm}}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
            <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
        </DataGrid.Columns>
    </DataGrid>

当我单击一个按钮 (Command="SendRequestCmd") 时,我将我的自定义类 ("Pack") 的一项添加到我的 ObservableCollection SinglePackResultList。 在我的 ViewModel 的构造函数中,我有这个:

SinglePackResultList = new ObservableCollection<Pack>();

SendRequestCmd = new RelayCommand((object z) =>
{
    try
    {
        SinglePackResultList.Add(SOAPRequest.SOAPRequestHandler(new Pack() {Created = (DateTime.Now).ToShortDateString(), ProductCode = ProductCode_SinglePack, BatchID = BatchID_SinglePack, BatchExpiry = BatchExpiry_SinglePack, PackSerialnumber = SerialNumber_SinglePack, PackTransaction = Transaction_SinglePack.TransactionID }));
    }
    catch (Exception)
    {
        return;
    }
},
CanExecute);

当我设置一个调试点时,我可以看到,在每次单击按钮后,我的 ObservableCollection SinglePackResultList 中都会有其他项目 - 所以这是可行的。 但不幸的是,Datagrid 保持为空。我尝试在SinglePackResultList.Add(...) 之后直接添加NotifyPropertyChanged("SinglePackResultList"),但效果不佳。

我完全不知道如何让它工作。 :-(

【问题讨论】:

  • 使其成为属性而不是字段。
  • 我有点迷路了。我现在从构造函数中删除了SinglePackResultList = new ObservableCollection&lt;Pack&gt;();。我的内部领域。我的财产看起来像这样:private ObservableCollection&lt;Pack&gt; _singlePackResultList; public ObservableCollection&lt;Pack&gt; SinglePackResultList { get { if (_singlePackResultList == null) _singlePackResultList = new ObservableCollection&lt;Pack&gt;(); return _singlePackResultList; } set { _singlePackResultList = value; } } 我到底需要改变什么? :-)
  • 您应该发布您的确切代码,因为它很重要。 Wpf 绑定通常只适用于属性。
  • 您是否正在创建视图模型的单个实例?
  • 大家好,感谢您的大力支持。这个问题已经解决了(见下面我的回答)。我的主要错误是,我没有在 View-constructor 中将 ViewModel 分配给我的 View 的 DataContext。

标签: c# wpf datagrid wpfdatagrid inotifypropertychanged


【解决方案1】:

在 WPF 中处理数据绑定的两种方式。

在构造函数中创建并且永远不要更改它。例如

public class A{
    public ObservableCollection<int> ObserableList { get; set; }

    public A() { ObservableList = new ObservableCollection<int>(); }
}

那么您只需添加或删除集合中的元素。

或者您可以使用完整的属性和事件PropertyChanged,这样您就可以为其分配另一个集合。

public class A {
    private ObservableCollection<int> observableList;

    public ObservableCollection<int> ObservableList
    {
        get { return observableList; }
        set
        {
            observableList = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ObservableList));
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Init() 
    {
        ObservableList = new ObservableCollection<int>();
    }
}

【讨论】:

    【解决方案2】:

    根据您的反馈,我可以确定我的错误。我忘记设置 ViewModel 的 DataContext 并删除了静态资源。

    所以这对我有用 - 也许这对其他人也有帮助:

    查看-XAML:

    <DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="1150" Margin="30" ItemsSource="{Binding SinglePackResultList}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
            <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
        </DataGrid.Columns>
    </DataGrid>
    

    View.cs(构造函数):

    public SinglePackTransactions_View()
    {
        InitializeComponent();
        this.DataContext = new SinglePackTransactions_ViewModel();
    }
    

    在我的 ViewModel 中,我只是使用 ObservableSollection 作为属性:

    public ObservableCollection<Pack> SinglePackResultList { get; set; }
    

    在我的 ViewModel 的构造函数中,我使用绑定的 ICommand-Button 将项目添加到我的 ObservableCollection:

    SinglePackResultList = new ObservableCollection<Pack>();
    
    SendRequestCmd = new RelayCommand((object z) =>
    {
        try
        {
            SinglePackResultList.Add(
                SOAPRequest.SOAPRequestHandler(
                    new Pack()
                    {
                        ProductCode = ProductCode_SinglePack,
                        BatchID = BatchID_SinglePack,
                        BatchExpiry = BatchExpiry_SinglePack,
                        PackSerialnumber = SerialNumber_SinglePack,
                        PackTransaction = Transaction_SinglePack.TransactionID
                    }
                )
            );
        }
        catch (Exception e)
        {
            return;
        }
    },
    CanExecute);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多