Я ранее создал прототип, похожий на то, что вы ищете. Я не использовал DataGrid, на самом деле я использовал ItemsControl, но я думаю, что это может быть полезно для вас.
То, что я сделал, заставило оба моих ItemsControls смотреть на одни и те же данные. Таким образом, если бы я удалил один объект, он также был бы удален из другого (поскольку это тот же источник данных).
Используя шаблон MVVM, я подошел к нему следующим образом.
Для начала, вот как выглядят две сетки, они обе показывают разные представления одних и тех же данных.
Вот мой MainPage.xaml
<UserControl x:Class="ViewModelDeleteObject.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ViewModelDeleteObject"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.DataContext>
<local:MainPage_ViewModel/>
</UserControl.DataContext>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding Coordinates}" Margin="20">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Blue" BorderThickness="1">
<StackPanel Orientation="Horizontal" Margin="3">
<Border BorderBrush="Red" BorderThickness="1">
<TextBlock Text="{Binding X}" TextAlignment="Right" Width="100" Margin="3"/>
</Border>
<Border BorderBrush="Red" BorderThickness="1">
<TextBlock Text="{Binding Y}" TextAlignment="Right" Width="100" Margin="3"/>
</Border>
<Button Content="Delete" Click="Button_Click" Tag="{Binding}"/>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Coordinates}" Margin="20">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Blue" BorderThickness="1">
<Border BorderBrush="Red" BorderThickness="1">
<TextBlock Text="{Binding XYCoordinate}" TextAlignment="Right" Width="100" Margin="3"/>
</Border>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.viewModel = this.DataContext as MainPage_ViewModel;
}
private MainPage_ViewModel viewModel;
private void Button_Click(object sender, RoutedEventArgs e)
{
viewModel.DeleteCoordinate((sender as Button).Tag as Coordinate_DataViewModel);
}
}
MainPage.xaml имеет следующий MainPage_ViewModel.cs, установленный как его DataContext:
public class MainPage_ViewModel : INotifyPropertyChanged
{
public MainPage_ViewModel()
{
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 1, Y = 2 }));
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 2, Y = 4 }));
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 3, Y = 6 }));
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 4, Y = 8 }));
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 5, Y = 10 }));
coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 6, Y = 12 }));
}
public ObservableCollection<Coordinate_DataViewModel> Coordinates
{
get { return coordinates; }
set
{
if (coordinates != value)
{
coordinates = value;
OnPropertyChanged("Coordinates");
}
}
}
private ObservableCollection<Coordinate_DataViewModel> coordinates = new ObservableCollection<Coordinate_DataViewModel>();
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void DeleteCoordinate(Coordinate_DataViewModel dvmToDelete)
{
coordinates.Remove(dvmToDelete);
}
}
Мои классы модели и модели представления данных также показаны ниже.
Модель
public class Coordinate_Model
{
public double X;
public double Y;
}
DataViewModel
public class Coordinate_DataViewModel
{
public Coordinate_DataViewModel(Coordinate_Model model)
{
this.underlyingModel = model;
}
private Coordinate_Model underlyingModel;
public double X
{
get { return underlyingModel.X; }
set { underlyingModel.X = value; }
}
public double Y
{
get { return underlyingModel.Y; }
set { underlyingModel.Y = value; }
}
public string XYCoordinate
{
get { return "(" + X + "," + Y + ")"; }
}
}
Теперь, когда я удаляю строку из первой сетки, вторая сетка немедленно обновляется, как показано ниже, где я удалил 4,8:
Я думаю, что это может быть похоже на то, что вы думали. Надеюсь, это поможет:)
Примечание. Весь код приведен здесь, поэтому вы сможете копировать, вставлять и выполнять его самостоятельно, если хотите.
Обновление: это решение было написано в Silverlight, но я заметил, что ваш вопрос «WPF» и помечен как Silverlight. Даже если вы используете WPF, этот пример все равно будет полезным. Извините!
Обновление: ОК, я обновлю его, чтобы использовать DataGrid. Это буквально заняло у меня две минуты, чтобы реализовать с предыдущим кодом, который был дан. Единственное, что нужно было изменить, - это вид, обратите внимание, что никакой другой код не был затронут.
Вот новые элементы в представлении:
<data:DataGrid ItemsSource="{Binding Coordinates}" AutoGenerateColumns="False" Margin="10">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="X Position" Width="100" Binding="{Binding X}"/>
<data:DataGridTextColumn Header="Y Position" Width="100" Binding="{Binding Y}"/>
<data:DataGridTemplateColumn Header="Delete Item" Width="100">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" Tag="{Binding}" Click="Button_Click"/>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>
<data:DataGrid ItemsSource="{Binding Coordinates}" AutoGenerateColumns="False" Margin="10">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Coordinate" Width="100" Binding="{Binding XYCoordinate}"/>
</data:DataGrid.Columns>
</data:DataGrid>
Вот как выглядят начальные сетки:
Вот как это выглядит после удаления: