多くの DataGrid がある WPF + MVVM に基づいて Prism + MEF アプリケーションを開発しているため、すべてのモジュールのすべての DataGrid に適用される DataGridStyle を構築します。スタイルは、列ヘッダーにフィルター テキスト ボックスを追加し、MVVM Light EventToCommand を使用して、テキスト ボックスのテキストが次のように変更されたときに TextChanged イベントをトリガーしました: (このコードは DataGridStyle リソース ディクショナリに存在します)
<TextBox x:Name="filterTextBox"
HorizontalAlignment="Right" MinWidth="25" Height="Auto"
OpacityMask="Black" Visibility="Collapsed"
Text=""
TextWrapping="Wrap" Grid.Column="0" Grid.ColumnSpan="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding DataContext.TextChangedCommand}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
次に、添付プロパティを使用して、ViewModel (データ グリッドを含むビューに関連する) で TextChangedCommand を処理しました。
#region TextChangedCommand----------------------------------------------------------------------------------------------
static ICommand command; //1
public static ICommand GetTextChangedCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(TextChangedCommandProperty);
}
public static void SetTextChangedCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(TextChangedCommandProperty, value);
}
// Using a DependencyProperty as the backing store for TextChangedCommand. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextChangedCommandProperty =
DependencyProperty.RegisterAttached("TextChangedCommand",
typeof(ICommand),
typeof(SubsystemAllViewModel),
new UIPropertyMetadata(null, CommandChanged));
static void CommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var fe = obj as FrameworkElement;
command = e.NewValue as ICommand;
fe.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(ExecuteCommand));
}
static void ExecuteCommand(object sender, TextChangedEventArgs e)
{
//Some Code
}
#endregion
そして、グリッドを含むビュー:
<DataGrid ItemsSource="{Binding Subsystems,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectedSubsystem, Mode=TwoWay}"
Name="SubsystemAllDataGrid"
Style="{StaticResource DataGridStyle}"
Grid.Row="2">
<DataGrid.Columns>
<DataGridTextColumn Header="Serial" Binding="{Binding Path=Serial, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Type" Binding="{Binding Path=Type, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="System" Binding="{Binding Path=System, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="SubsystemNo" Binding="{Binding Path=SubsystemNo, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Description" Binding="{Binding Path=Description, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Scope" Binding="{Binding Path=Scope, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Area" Binding="{Binding Path=Area, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Priority" Binding="{Binding Path=Priority, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="DossierLocation" Binding="{Binding Path=DossierLocation, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Parts" Binding="{Binding Path=Parts, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Status" Binding="{Binding Path=Status, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="StatusDate" Binding="{Binding Path=StatusDate, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="MCDate" Binding="{Binding Path=MCDate, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="PlnMCDate" Binding="{Binding Path=PlnMCDate, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Remark" Binding="{Binding Path=Remark, Mode=TwoWay}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
問題は次のとおりです。データ グリッドの列ヘッダーの 1 つのテキスト ボックスにフィルター テキストを入力すると、何も起こらず、次のポイントのブレーク ポイントがヒットしません。
1-GetTextChangedCommand と SetTextChangedCommand
2-CommandChanged() メソッド。
私は wpf を初めて使用するので、WPF または C# コードに問題があると確信しています。これらの問題の修正を手伝ってください。
注: コード ビハインドは使用しません。
前もって感謝します