Обновлять привязку DataGrid только в первый раз - PullRequest
0 голосов
/ 26 января 2012

У меня есть вид с кнопкой и сеткой данных. Файл 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, который выполняет команду. Эта команда также использует другой класс для запроса данных из базы данных. Этот класс использует EF 4.1 и возвращает context.Persons.Local. Это возвращение - то, что я установил ObservableCollection Persons ModelView.

Это работает, по крайней мере, и первый раз, когда я нажимаю кнопку. В остальное время dataGrid не получает данные, не связывает новые результаты.

Сначала я пытаюсь в своем командном классе очистить объекты ObservableCollection с помощью метода clear (), создать временную ObservableCollection для получения возвращаемого Persons.Local и использовать foreach с этой временной ObservableCollection, чтобы добавить его элементы в ObservableCollection Люди, чтобы обнаружить новые изменения, но это не работает. Я знаю, что это плохое решение, потому что, если у локального есть много элементов, это могло бы быть очень медленным, но это было посмотреть, смогу ли я обновить dataGrid, но не.

Почему это работает только в первый раз?

Спасибо. Daimroc.

РЕДАКТИРОВАТЬ: я добавил новый код.

РЕДАКТИРОВАТЬ 2: Решено.

Ну наконец-то я нашел ошибку. Проблема не в привязке, это моя ошибка, потому что я преобразовал код из CodeBehind в MVVM и тоже изменяю ItemsSorce в коде позади.

Я не понял, что кнопка для очистки критериев поиска изменила dataGrid из кода, а затем itemsSource изменился непредвиденным образом.

Я сейчас создал новую команду для кнопки очистки и работает в порядке.

Большое спасибо за вашу помощь. Daimroc.

1 Ответ

0 голосов
/ 26 января 2012

Я не прочитал весь ваш код, но, черт побери, почему вы используете триггер взаимодействия, а не просто свойство Command кнопки?Это может быть первое, что вы попробуете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...