ボタンとデータグリッドを持つビューがあります。私は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が予期しない方法で変更されたことに気付きません。
ボタンの新しいコマンドが作成され、正常に動作するようになりました。
ありがとうございました。ダイムロク
これは私だけかもしれませんが、XAMLにボタンが表示されません。そして 'DgdPersons'を実際に更新するコードを投稿できますか? – Rachel
あなたはこれを読むべきです:http://sscce.org/ – Will