仅在第一次更新DataGrid绑定

时间:2012-01-26 17:20:07

标签: wpf binding mvvm

我有一个带有按钮和dataGrid的视图。 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;}
    }`

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

   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执行命令。此命令也使用其他类从DataBase请求数据。此类使用EF 4.1并返回context.Persons.Local。这个返回是我设置ModelView的ObservableCollection Persons。

这至少在我第一次点击按钮时起作用。其余时间dataGrid不接收数据,不会绑定新结果。

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

为什么它只是第一次有效?

感谢。 Daimroc。

编辑:我添加了新代码。

编辑2:解决了。

好吧,最后我发现了错误。问题不在于绑定,这是我的错,因为我已经将代码从CodeBehind转换为MVVM,我也在代码隐藏中修改ItemsSorce。

我没有意识到清除搜索条件的按钮从代码隐藏中改变了dataGrid,然后itemsSource以一种未预料到的方式发生了变化。

我现在已经为按钮清理创建了一个新命令,并按原样运行。

非常感谢你的帮助。 Daimroc。

1 个答案:

答案 0 :(得分:0)

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