Я добавил поведение «DataGridSelectedItemsBehavior» в xaml:
<DataGrid x:Name="MessagesListView" Grid.Row="0" Style="{StaticResource BasicDataGridStyleWithAutoHeight}"
ItemsSource="{Binding Source={StaticResource MessagesView}}" AutoGenerateColumns="False"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
IsEnabled="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}" IsReadOnly="True"
SelectionMode="Extended">
<i:Interaction.Behaviors>
<behaviors:DataGridSelectedItemsBehavior SelectedItems="{Binding SelectedItems, Mode=OneWayToSource}" />
</i:Interaction.Behaviors>
Это класс DataGridSelectedItemsBehavior, и свойство «SelectedItems» работает правильно.В зависимости от того, что выбрано, эта коллекция IEnumerable заполняется.
public class DataGridSelectedItemsBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
=> AssociatedObject.SelectionChanged += AssociatedObjectSelectionChanged;
protected override void OnDetaching()
=> AssociatedObject.SelectionChanged -= AssociatedObjectSelectionChanged;
private void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var array = new object[AssociatedObject.SelectedItems.Count];
AssociatedObject.SelectedItems.CopyTo(array, 0);
SelectedItems = array;
}
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems", typeof(IEnumerable), typeof(DataGridSelectedItemsBehavior),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public IEnumerable SelectedItems
{
get => (IEnumerable)GetValue(SelectedItemsProperty);
set => SetValue(SelectedItemsProperty, value);
}
}
![enter image description here](https://i.stack.imgur.com/DquiQ.png)
Я хочу иметь доступ к этому свойству в моей viewModel, чтобы скопировать всевыбрал элементы в буфер обмена и не знаю, как это правильно сделать:
public class MessagesViewModel : DialogWindowViewModel, IMessagesViewModel
{
public ObservableCollection<IEnumerable> SelectedItems { get; set; } = new ObservableCollection<IEnumerable>();
public MessagesViewModel(ILoggingService loggingService, ILogger logger = null)
{
_logger = logger;
_loggingSvc = loggingService;
CopyCommand = new RelayCommand(async () => await CopyLog().ConfigureAwait(false));
}
public RelayCommand CopyCommand { get; }
private async Task CopyLog()
{
Clipboard.SetText(FormatForClipboard(SelectedItems));
}
FormatForClipboard()
{
...
}
}
Спасибо за ответ.