Образцы интерактивной системы реляционных данных WPF? - PullRequest
0 голосов
/ 10 марта 2011

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

1 Ответ

1 голос
/ 10 марта 2011

Я ранее создал прототип, похожий на то, что вы ищете. Я не использовал DataGrid, на самом деле я использовал ItemsControl, но я думаю, что это может быть полезно для вас.

То, что я сделал, заставило оба моих ItemsControls смотреть на одни и те же данные. Таким образом, если бы я удалил один объект, он также был бы удален из другого (поскольку это тот же источник данных).

Используя шаблон MVVM, я подошел к нему следующим образом.

Для начала, вот как выглядят две сетки, они обе показывают разные представления одних и тех же данных.

Multiple Representations of the same data

Вот мой 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: ​​

enter image description here

Я думаю, что это может быть похоже на то, что вы думали. Надеюсь, это поможет:)

Примечание. Весь код приведен здесь, поэтому вы сможете копировать, вставлять и выполнять его самостоятельно, если хотите.

Обновление: это решение было написано в 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>

Вот как выглядят начальные сетки: Initial Grids

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

...