我之前已经创建了一个类似于您正在寻找的原型。我没有使用 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;
}
数据视图模型
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>
这是初始网格的样子:
这是删除后的样子: