Интерактивные образцы реляционной системы данных WPF?

Мне интересно, может ли кто-нибудь поделиться или указать на хорошие образцы структуры сетки данных, которые можно использовать в приложении Silverlight. Мне нужно иметь 4 реляционных сетки данных, одна из которых является главной сеткой данных, в которой содержится большая часть данных. Я должен иметь возможность удалять, добавлять или изменять свойства элементов. Эти изменения также должны затронуть другие сетки данных. Например, если я удаляю один элемент из главной сетки данных, экземпляр этого элемента должен быть удален из других сеток данных. Любая информация высоко ценится. Заранее спасибо!


person vladc77    schedule 10.03.2011    source источник


Ответы (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 has the following MainPage_ViewModel.cs set as its 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>

Вот как выглядят исходные сетки: Исходные сетки

Вот как это выглядит после удаления: Сетки после удаления

person JSprang    schedule 10.03.2011
comment
Спасибо за ваш образец. Да, я ищу особенно Silverlight. Почему вы не использовали сетку данных во время создания этого приложения? Мне интересно, в чем была причина. Я попробую ваш код и дам вам знать, если он будет работать с моими потребностями. Я высоко ценю вашу помощь. - person vladc77; 11.03.2011
comment
Когда я делал свой прототип, я не беспокоился о том, как отображались данные, я беспокоился об обновлении нескольких представлений при изменении объектов, которые они разделяли. DataGrid — это просто представление данных, и его можно очень легко использовать вместо ItemsControl, который я использую. Если бы мой прототип должен был заставить работать DataGrid, то я бы использовал DataGrid, есть ли смысл? Я надеюсь, что вы сможете реализовать свое решение. - person JSprang; 11.03.2011
comment
Есть еще образцы? Даже несмотря на то, что JSprang поделился очень хорошим образцом, я хотел бы найти любой образец, который работает с сетками данных. - person vladc77; 11.03.2011
comment
Вау, это очень хороший образец! Я обновил свой проект, который работал раньше. Теперь я получаю сообщение об ошибке, что имя DataGrid не существует в пространстве имен. Вы изменили ссылку на пространство имен? Я попытался сослаться на Silverlight SDK, но это тоже не работает. Мне интересно, в чем может быть проблема. В противном случае, это действительно хорошо. Еще раз спасибо за ваше время и усилия, чтобы помочь. - person vladc77; 12.03.2011
comment
Добавьте это в верхнюю часть вашего элемента управления: xmlns:data=clr-namespace:System.Windows.Controls; Assembly=System.Windows.Controls.Data Вам также потребуется добавить ссылку на System.Windows.Controls.Data. - person JSprang; 12.03.2011
comment
Привет Джей Спранг. Я пытаюсь применить метод удаления строки к элементу контекстного меню. Моя проблема в том, что я не могу правильно связать его с SeletedItem в сетке данных. Это точно такой же образец, который вы предоставили, но вместо кнопок «Удалить» я хочу использовать контекстное меню. Мне интересно, если вы можете помочь. Еще раз спасибо. - person vladc77; 21.03.2011
comment
Я не делал этого раньше, но вы можете попробовать следующее: Создал свойство SelectedItem в ViewModel. В сетке вы можете привязать выбранный элемент к этому свойству. Затем, когда вы выполняете удаление, просто заставьте его вызывать метод в модели представления, который удаляет выбранный элемент. Имеет ли это смысл? Надеюсь, это поможет :) - person JSprang; 21.03.2011
comment
Похоже, вы задали это в другом вопросе. Я разместил там ответ для вас, который должен работать. - person JSprang; 21.03.2011