【问题标题】:Interactive WPF relational datagrid system samples?交互式 WPF 关系数据网格系统示例?
【发布时间】:2011-07-13 00:09:56
【问题描述】:

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

【问题讨论】:

    标签: data-binding silverlight-4.0 datagrid


    【解决方案1】:

    我之前已经创建了一个类似于您正在寻找的原型。我没有使用 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>
    

    这是初始网格的样子:

    这是删除后的样子:

    【讨论】:

    • 感谢您的样品。是的,我特别在寻找 Silverlight。为什么在构建该应用程序时没有使用 datagrid?我想知道是什么原因。我会尝试你的代码,并会让你知道它会满足我的需要。我非常感谢您的帮助。
    • 当我制作我的原型时,我并不关心数据是如何显示的,我关心的是当多个视图共享的对象发生变化时它们会被更新。 DataGrid 只是一个数据视图,可以很容易地代替我正在使用的 ItemsControl。如果我的原型是让 DataGrid 工作,那么我会使用 DataGrid,有意义吗?我希望您能够实施您的解决方案。
    • 还有样品吗?即使 JSprang 分享了非常好的示例,我也想找到任何适用于数据网格的示例。
    • 哇,这是非常好的样本!我更新了我以前工作的项目。现在,我收到命名空间中不存在“DataGrid”名称的错误。您是否更改了命名空间引用?我试图将它引用到 Silverlight SDK,但它也不起作用。我想知道可能是什么问题。否则,它真的很好。再次感谢您花时间和努力提供帮助。
    • 将此添加到控件的顶部: xmlns:data="clr-namespace:System.Windows.Controls; assembly=System.Windows.Controls.Data" 您还需要添加一个引用到 System.Windows.Controls.Data
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多