Отправить выбранный объект в другой элемент управления в WPF / Silverlight? - PullRequest
0 голосов
/ 14 марта 2011

Я работаю над WPF Projet, в котором у меня есть представление с двумя пользовательскими элементами управления.В основном это UserControl с сеткой и еще один с панелью редактирования для редактирования выбранного объекта в DataGrid.Элемент управления панели редактирования состоит из текстовых полей для редактирования свойств выбранного объекта в другом элементе управления и кнопки для сохранения.Я хотел бы передать выбранный объект на панель редактирования, то есть каждый раз, когда объект выбирается в сетке, панель редактирования обновляется, чтобы выбрать тот же объект.Каков наилучший способ сделать это, пожалуйста, помогите? Пример будет супер: 0)

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Лучший способ справиться с этим - использовать шаблон MVVM, в котором оба ваших пользовательских элемента управления привязаны к одной и той же ViewModel.

Сетка может привязывать к вашей коллекции (List <>) объектов, которые вы хотите показать, и она также может привязывать свое свойство SelectedRow / SelectedItem к соответствующему свойству в ViewModel с именем SelectedItem (или подобному). Это означает, что каждый раз, когда в сетке выбирается строка, базовый объект данных будет заполняться в свойстве ViewModel.

Затем вы привязываете пользовательский элемент управления Details к тому же свойству SelectedItem в ViewModel. Проверьте этот очень простой пример привязки DataGrid и TextBox к одному и тому же свойству SelectedItem:

ViewModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace WpfApplication11
{
    public class MyViewModel : INotifyPropertyChanged
    {
        public List<Customer> MyList 
        {
            get { return _myList; }
            set
            {
                _myList = value;
                OnPropertyChanged("MyList");
            }
        }

        public Customer SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                OnPropertyChanged("SelectedItem");
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private Customer _selectedItem;
        private List<Customer> _myList;
    }

    public class Customer
    {
        public string Name { get; set; }
    }
}

MainWindow

<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:swm="clr-namespace:System.Windows.Media;assembly=WindowsBase"
        xmlns:swm1="clr-namespace:System.Windows.Media;assembly=PresentationCore"

        Title="MainWindow" Height="289" Width="525">
    <Grid>
        <DataGrid AutoGenerateColumns="True" Margin="12,12,12,38" Name="dataGrid1" ItemsSource="{Binding MyList}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
        <Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="12,222,0,0" Name="label1" VerticalAlignment="Top" Width="57" />
        <TextBox Text="{Binding Path=SelectedItem.Name, Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="60,222,0,0" Name="textBox1" VerticalAlignment="Top" Width="267" />
    </Grid>
</Window>

Код MainWindow за

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication11
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            MyViewModel vm = new MyViewModel();
            vm.MyList = new List<Customer>(new Customer[] { new Customer() { Name = "Bugs Bunny" }, new Customer() { Name = "Elmer Fudd" } });
            this.DataContext = vm;
        }
    }
}

Если вы запустите это, а затем выберете строку в сетке, имя клиента будет введено в текстовое поле внизу. Если затем вы измените имя в текстовом поле и уберете с него фокус (вне таблицы TAB), тогда строка в сетке данных будет обновлена ​​с новым именем - все через привязку.

Для получения дополнительной информации ранее было несколько тысяч вопросов о переполнении стека в отношении шаблона MVVM с WPF, , многие из которых конкретно касались представлений основной детали , таких как тот, который вы хочу.

0 голосов
/ 14 марта 2011

В вашей разметке XAML просто привяжите объект панели редактирования к выбранному объекту в объекте сетки.

...