Это происходит потому, что ваше новое свойство SelectedItems
никогда не обновляет базу SelectedItems
, когда оно установлено. Проблема в том, что MultiSelector.SelectedItems
только для чтения. Он был разработан специально для того, чтобы его нельзя было установить - но он также был разработан с возможностью обновляемости .
. Причина, по которой ваш код работает вообще, заключается в том, что когда вы меняете выбор с помощью BindableDataGrid
, SelectedWidgets
получает замену на DataGrid
внутреннюю SelectedItemsCollection
. После этого вы добавляете и удаляете из этой коллекции, поэтому он обновляет DataGrid
.
Конечно, это не сработает, если вы еще не изменили выбор, потому что OnSelectionChanged
не до тех пор не запускается, поэтому SetCurrentValue
никогда не вызывается, поэтому привязка никогда не обновляется SelectedWidgets
. Но это нормально, все, что вам нужно сделать, называется SetCurrentValue
как часть инициализации BindableDataGrid
.
Добавьте это к BindableDataGrid
:
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
SetCurrentValue(SelectedItemsProperty, base.SelectedItems);
}
Будьте осторожны, хотя потому что это все равно сломается, если вы попытаетесь установить SelectedItems
через некоторое время после инициализации. Было бы неплохо, если бы вы могли сделать это только для чтения, но это мешает использовать его в привязке данных. Поэтому убедитесь, что ваша привязка использует OneWayToSource
, а не TwoWay
:
<test:BindableDataGrid Grid.Column="4"
SelectionMode="Extended"
ColumnWidth="*"
ItemsSource="{Binding Widgets}"
SelectedItems="{Binding SelectedWidgets, Mode=OneWayToSource}"
IsReadOnly="true">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="CornflowerBlue"/>
</Style.Resources>
</Style>
</DataGrid.RowStyle>
</test:BindableDataGrid>
Если вы хотите, чтобы это никогда не ломалось, вы можете добавить CoerceValueCallback
, чтобы убедиться, что new SelectedItems
никогда не устанавливается на что-либо кроме base.SelectedItems
:
public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register(
"SelectedItems",
typeof(IList),
typeof(BindableDataGrid),
new PropertyMetadata(default(IList), null, (o, v) => ((BindableDataGrid)o).CoerceBindableSelectedItems(v)));
protected object CoerceBindableSelectedItems(object baseValue)
{
return base.SelectedItems;
}