4

Caliburn.Micro を使用した WPF アプリケーションがあります。

DataGrid には属性 SelectedItem="{Binding Path=SelectedUsageRecord}" があります。

ご覧のとおり、SelectedItem は SelectedUsageRecord プロパティにバインドされています。しかし、複数のレコードの選択を処理できる必要があります。複数のレコードをコレクション プロパティにバインドすることは可能ですか? 「SelectedItems」のようなものはありません...ありがとう。

4

3 に答える 3

6

あなたと同じシナリオを打った後に私がしたことは次のとおりです。つまり、選択変更イベントを直接処理し、選択した行をイベント引数から引き出します。それぞれが RowViewModel である「Rows」のソース コレクションと、「_selectedRows」のコレクションを想定しています。

<DataGrid RowsSource="{Binding Rows}" x:Name="Rows"                  
          SelectionMode="Extended" SelectionUnit="FullRow">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cal:ActionMessage MethodName="SelectedRowsChangeEvent">
                <cal:Parameter Value="$eventArgs" />
            </cal:ActionMessage>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>
public void SelectedRowsChangeEvent(SelectionChangedEventArgs e)
{
    foreach (var addedRow in e.AddedRows)
    {
        _selectedRows.Add(addedRow as RowViewModel);
    }

    foreach (var removedRow in e.RemovedRows)
    {
        _selectedRows.Remove(removedRow as RowViewModel);
    }
}
于 2012-11-01T02:04:42.010 に答える
5

私は自分のソリューションを投稿したかっただけです。Caliburn micro では、命名規則に忠実である限り、ソースを設定する必要はありません。

Xaml

<DataGrid x:Name="Rows" SelectionMode="Extended" cal:Message.Attach="[Event SelectionChanged] = [Row_SelectionChanged($eventArgs)]">

C#

public List<MyObject> Rows { get; set; }

public MyObject SelectedRow { get; set; } //Will be set by Caliburn Micro. No need to use "SelectedItem={...}"

List<MyObject> _selectedObjects = new List<MyObject>();    

public void Row_SelectionChanged(SelectionChangedEventArgs obj)
{
  _selectedObjects.AddRange(obj.AddedItems.Cast<MyObject>());
  obj.RemovedItems.Cast<MyObject>().ToList().ForEach(w => _selectedObjects.Remove(w));
}
于 2017-01-10T07:24:55.300 に答える