Data binding 交互式WPF关系数据网格系统示例?

Data binding 交互式WPF关系数据网格系统示例?,data-binding,silverlight-4.0,datagrid,Data Binding,Silverlight 4.0,Datagrid,我想知道是否有人可以分享或指出可以在Silverlight应用程序中使用的datagrid结构的良好示例。我需要有4个关系数据网格,其中一个是主数据网格,主数据网格拥有大部分数据。我应该能够删除或添加或更改项目的属性。此更改还应影响其他数据网格。例如,如果我从主数据网格中删除一个项,那么该项的实例应该从其他数据网格中删除。非常感谢您提供的任何信息。提前谢谢你 我之前创建了一个与您所寻找的类似的原型。我没有使用DataGrid,实际上我使用的是ItemsControl,但我认为它可能对您有益 我所

我想知道是否有人可以分享或指出可以在Silverlight应用程序中使用的datagrid结构的良好示例。我需要有4个关系数据网格,其中一个是主数据网格,主数据网格拥有大部分数据。我应该能够删除或添加或更改项目的属性。此更改还应影响其他数据网格。例如,如果我从主数据网格中删除一个项,那么该项的实例应该从其他数据网格中删除。非常感谢您提供的任何信息。提前谢谢你

我之前创建了一个与您所寻找的类似的原型。我没有使用DataGrid,实际上我使用的是ItemsControl,但我认为它可能对您有益

我所做的是让我的两个ItemsControl查看相同的数据。这样,如果我删除一个对象,它也会从另一个对象中删除(因为它是相同的数据源)

使用MVVM模式,我是这样处理的

首先,这是两个网格的外观,它们都显示相同数据的不同表示形式

这是我的主页.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>
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_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>

以下是初始网格的外观:

以下是删除后的外观:

谢谢您的样品。是的,我特别想找Silverlight。为什么在构建应用程序时没有使用datagrid?我想知道原因是什么。我会尝试你的代码,并会让你知道它将与我的需要工作。我非常感谢您的帮助。当我制作我的原型时,我并不关心数据的显示方式,我关心的是多个视图在它们共享的对象发生更改时被更新。DataGrid只是一个数据视图,可以很容易地代替我正在使用的ItemsControl来使用。如果我的原型是让DataGrid工作,那么我会使用DataGrid,有意义吗?我希望您能够实现您的解决方案。还有其他示例吗?即使JSprang分享了非常好的示例,我也希望找到任何与datagrids一起工作的示例。哇,这是一个非常好的示例!我更新了以前工作过的项目。现在,我得到一个错误,即名称空间中不存在“DataGrid”名称。您是否更改了名称空间引用?我试图将其引用到Silverlight SDK,但它也不起作用。我想知道有什么问题。否则,它真的很好。再次感谢您花时间和精力提供帮助。将此添加到控件顶部:xmlns:data=“clr namespace:System.Windows.Controls;assembly=System.Windows.Controls.data”您还需要添加对System.Windows.Controls.data的引用
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 + ")"; }
    }
}
<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>