0

2 つのデータグリッドがあります。1 つまたは複数の行をダブルクリックすると、アイテムを切り替えることができます。doubleclick イベントは、選択された項目のリストをビューモデルに送信するコマンドによって処理されます。

だから私はトリガー付きのDatagrid 1を持っています:

<i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProducts">
                    <cmd:EventToCommand Command="{Binding Path=Add}" 
                                        CommandParameter="{Binding ElementName=lstProducts, Path=SelectedItems}" />
                </i:EventTrigger>
</i:Interaction.Triggers>

そして Datagrid 2 トリガー:

<i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick"  SourceName="dgProducts">
                    <cmd:EventToCommand Command="{Binding Path=Remove}"
                                    CommandParameter="{Binding ElementName=dgProducts,Path=SelectedItems}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>

Datagrid をダブルクリックするたびに、Add AND Remove コマンドが呼び出されます。しかし、両方のデリゲート コマンド メソッド内にデバッグ ポイントを設定すると、1 つしか入力されません。1つだけセットすれば、どれでも入ります。

たとえば、最初のデータグリッドをクリックすると、追加コマンドを呼び出す必要があるため、ブレークポイントで停止します。しかし、ブレークポイントを削除するように設定したときも、両方ではありません。

SourceNameSourceObjectを適用しようとしましたが、役に立ちません..

多分誰かがこれを修正する方法を知っていますか?

4

1 に答える 1

0

私はあなたのシナリオが適切に機能していると思います:

public partial class MainWindow : Window
{
    public ObservableCollection<Product> Added { get; set; }

    public ObservableCollection<Product> Available { get; set; }

    public ICommand Add { get; set; }

    public ICommand Remove { get; set; }

    public MainWindow()
    {
        Added = new ObservableCollection<Product>();
        Available = new ObservableCollection<Product>();
        Available.Add(new Product { Id = 1 });
        Available.Add(new Product { Id = 2 });
        Available.Add(new Product { Id = 3 });
        Available.Add(new Product { Id = 4 });
        Available.Add(new Product { Id = 5 });
        InitializeComponent();
        DataContext = this;

        Add = new RelayCommand<IEnumerable>(x =>
        {
            foreach (Product item in x.Cast<Product>().ToArray())
            {
                Added.Add(item);
                Available.Remove(item);
            }

            Console.WriteLine("add");
        });

        Remove = new RelayCommand<IEnumerable>(x =>
        {
            foreach (Product item in x.Cast<Product>().ToArray())
            {
                Added.Remove(item);
                Available.Add(item);
            }
            Console.WriteLine("remove");
        });
    }
}

public class Product
{
    public int Id { get; set; }
}

およびxaml:

<StackPanel >

    <DataGrid ItemsSource="{Binding Available}" SelectionUnit="FullRow" x:Name="lstProducts">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProducts">
                <cmd:EventToCommand Command="{Binding Path=Add}"
                                    CommandParameter="{Binding ElementName=lstProducts, Path=SelectedItems}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </DataGrid>

    <DataGrid ItemsSource="{Binding Added}" SelectionUnit="FullRow" x:Name="lstProductsAdded" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProductsAdded">
                <cmd:EventToCommand Command="{Binding Path=Remove}"
                                    CommandParameter="{Binding ElementName=lstProductsAdded, Path=SelectedItems}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </DataGrid>

</StackPanel>

これはあなたがした/やりたかったことですか?私のサンプルでは、​​1 つのコマンドだけが実行されます。出力ウィンドウで確認できます。

このコードを壊して動作を再現する方法を見つけました。両方の i:EventTrigger タグで同じ SoruceName を使用しているため、単一のグリッドにバインドします。

于 2012-07-11T11:45:16.140 に答える