【问题标题】:Only update a DataGrid binding the first time仅在第一次更新 DataGrid 绑定
【发布时间】:2012-01-26 17:20:06
【问题描述】:

我有一个带有按钮和数据网格的视图。 XAML 文件是这样的:

    <Window x:Class="MusicaDB.Views.PrincipalView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
            Title="Principal" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="627" d:DesignWidth="1176" SizeToContent="WidthAndHeight">

        <Window.Resources>
            <DataTemplate x:Key="BlueHeader">
                <StackPanel Orientation="Horizontal" Margin="-5,-5,-5,-5" Width="120">
                    <StackPanel.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF223B84" Offset="1"/>
                            <GradientStop Color="#FF57A0F4" Offset="0.5"/>
                            <GradientStop Color="#FF4B94EC" Offset="0.5"/>
                        </LinearGradientBrush>
                    </StackPanel.Background>
                    <TextBlock Margin="10,10,10,10" Text="{Binding}" VerticalAlignment="Center" Foreground="White"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>

<Button Content="Search"
                Height="23"
                HorizontalAlignment="Left"
                Margin="12,165,0,0"
                Name="btnPersonSearch"
                VerticalAlignment="Top"
                Width="48">

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <i:InvokeCommandAction
                        Command="{Binding PersonSearch}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

        <Grid Height="558" Width="1099">
            <DataGrid            
                Height="164"
                HorizontalAlignment="Left"
                Margin="339,24,0,0"
                Name="dgdAutores"
                VerticalAlignment="Top"
                Width="540"
                IsTextSearchEnabled="True"
                CanUserAddRows="True"
                CanUserDeleteRows="True"
                ItemsSource="{Binding DgdPersons}">

                <DataGrid.Columns>
                    <DataGridTextColumn Header="IDPerson" Binding="{Binding IDPerson}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>

在我的 ViewModel.cs 中,我有两个属性,一个用于绑定,另一个用于命令。

`

private ObservableCollection<Persons> _dgdPersons;
    public ICommand _personsSearch { get; set; }

    public ObservableCollection<Persons> DgdPersons
    {
        get { return _dgdPersons; }
        set
        {
            _dgdPersons = value;
            base.RaisePropertyChangedEvent("DgdPersons");
        }
    }


    public ICommand PersonsSearch
    {
        get{return _personsSearch;}
    }`

这是我用来搜索人员的代码,我在其中更新了 Persons:

   using System;
    using System.Windows.Input;
    using PersonsDB.ViewModel;

    using System.Collections.ObjectModel;

    using PersonsDB.DBModels;

    using System.Windows.Controls;


    namespace MusicaDB.Commands
    {
        public class AutoresBuscarCommand : ICommand
        {
            private ViewModelMain _ViewModel;



            public PersonsSearchCommand(ViewModelMain viewModel)
            {
                _ViewModel = viewModel;
            }



            public bool CanExecute(object parameter)
            {

                return true;
            }


            public void Execute(Object parameter)
            {

                _ViewModel.DgdPersons = _ViewModel.DBManager.getPersons("Parameters of serach");

            }
        }
    }

注意:DBManager 是一个允许我访问数据库的类。此类内部使用 EF 4.1,getPersons 方法返回 context.Persons.Local。

这个 Command 类继承自一个基类:

using System.ComponentModel;

namespace PersonsDB.ViewModel
{
    public abstract class ViewModelBase : INotifyPropertyChanging, INotifyPropertyChanged
    {

        public event PropertyChangingEventHandler PropertyChanging;   


        public event PropertyChangedEventHandler PropertyChanged;   

        public virtual bool IgnorePropertyChangeEvents { get; set; }   


        public virtual void RaisePropertyChangedEvent(string propertyName)
        {
            // Exit if changes ignored
            if (IgnorePropertyChangeEvents) return;

            // Exit if no subscribers
            if (PropertyChanged == null) return;

            // Raise event
            var e = new PropertyChangedEventArgs(propertyName);
            PropertyChanged(this, e);
        }

        public virtual void RaisePropertyChangingEvent(string propertyName)
        {
            // Exit if changes ignored
            if (IgnorePropertyChangeEvents) return;

            // Exit if no subscribers
            if (PropertyChanging == null) return;

            // Raise event
            var e = new PropertyChangingEventArgs(propertyName);
            PropertyChanging(this, e);
        }
    }
}

好吧,为了不放很多代码,我还有其他类 PersonsSearchCommand 来执行命令。该命令还使用其他类从数据库中请求数据。此类使用 EF 4.1 并返回 context.Persons.Local。这个返回值就是我设置的 ModelView 的 ObservableCollection Persons。

至少在我第一次单击该按钮时这是有效的。其余时间dataGrid不接收数据,不绑定新结果。

我尝试在我的命令类中,首先使用 clear() 方法清除 ObservableCollection 人员,创建一个临时 ObservableCollection 以接收返回的 Persons.Local 并使用具有此临时 ObservableCollection 的 foreach 将其元素添加到 ObservableCollection检测新变化的人员,但这不起作用。我知道这是一个不好的解决方案,因为如果本地有很多元素,它可能会很慢,但它是看我是否可以更新 dataGrid,但不是。

为什么只有第一次有效?

谢谢。 戴姆洛克。

编辑:我添加了新代码。

编辑 2:已解决。

好吧,我终于找到了错误。问题不在于绑定,这是我的错,因为我已将代码从 CodeBehind 转换为 MVVM,并且我也在修改代码隐藏中的 ItemsSorce。

我没有意识到清除搜索条件的按钮从代码隐藏中更改了 dataGrid,然后 itemsSource 发生了意想不到的变化。

我现在已经为按钮清洁创建了一个新命令,并且可以正常工作。

非常感谢您的帮助。戴姆洛克。

【问题讨论】:

  • 可能只是我,但我在您的 XAML 中看不到按钮。你能发布实际更新DgdPersons的代码吗?
  • 你应该阅读这个:sscce.org

标签: wpf binding mvvm


【解决方案1】:

我还没有阅读您的所有代码,但我想不到,您为什么要使用交互触发器而不是仅使用按钮的 Command 属性?这可能是您尝试的第一件事。

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2018-06-06
    • 2014-07-22
    相关资源
    最近更新 更多