2012-01-26 15 views
-1

ボタンとデータグリッドを持つビューがあります。私は2つのプロパティ、コマンドのための結合および他のための1つを持っている私のViewModel.csで最初にDataGridバインディングを更新するだけです

<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> 

:XAMLファイルがこれです。

`

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を返します。この戻り値はModelViewのObservableCollection Personを設定したものです。

これは少なくともボタンをクリックすると機能します。 DataGridがデータを受け取らない残りの時間は、新しい結果をバインドしません。

私は、コマンドクラスで、まずclear()メソッドでObservableCollectionをクリアし、戻り値のPersons.Localを受け取る一時ObservableCollectionを作成し、この一時的なObservableCollectionでforeachを使用してその要素をObservableCollection新しい変更を検出する人ですが、これは機能しません。私はこれが悪い解決策であることを知っています。ローカルに多くの要素があると、それは非常に遅くなる可能性がありますが、dataGridを更新するかどうかを確認することでした。

なぜ初めて動作するのですか?

ありがとうございました。 ダイムロク。

編集:私は新しいコードを追加しました。

EDIT 2:解決済み。

最後に、私はエラーを見つけました。私はCodeBehindからMVVMにコードを変換し、コードビハインドでItemsSorceも変更しているので、問題はバインディングではなく、私のせいです。

検索条件をクリアするボタンが、コードビハインドからdataGridを変更し、次にitemsSourceが予期しない方法で変更されたことに気付きません。

ボタンの新しいコマンドが作成され、正常に動作するようになりました。

ありがとうございました。ダイムロク

+0

これは私だけかもしれませんが、XAMLにボタンが表示されません。そして 'DgdPersons'を実際に更新するコードを投稿できますか? – Rachel

+1

あなたはこれを読むべきです:http://sscce.org/ – Will

答えて

0

私はあなたのコードをすべて読んだわけではありませんが、私の頭の上から離れて、なぜボタンのCommandプロパティを使うのではなく、相互作用のトリガーを使用していますか?それがあなたが試みる最初のものかもしれません。

関連する問題