0

多くの 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# コードに問題があると確信しています。これらの問題の修正を手伝ってください。

注: コード ビハインドは使用しません。

前もって感謝します

4

2 に答える 2

0

コマンドバインディングが機能しないようです。次のことを試してください。

Command="{Binding Path=TextChangedCommand}"

また

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}} Path=DataContext.TextChangedCommand}"
于 2013-04-18T14:02:47.827 に答える