将所选对象发送到WPF / Silverlight中的另一个控件?

时间:2011-03-14 07:08:20

标签: wpf events wpfdatagrid eventaggregator

我正在开发一个WPF Projet,我在其中有两个用户控件的视图。这基本上是一个带有网格的UserControl,另一个带有编辑面板,用于编辑DataGrid中的选定对象。编辑面板控件包含用于编辑其他控件中所选对象的属性的文本框和要保存的按钮。我想要做的是将选定的对象传递给编辑面板,即每次在网格中选择一个对象时,编辑面板会更新以选择同一个对象。这样做的最佳方式是什么,请帮忙?一个例子是超级:0)

2 个答案:

答案 0 :(得分:2)

处理此问题的最佳方法是使用MVVM模式,其中两个用户控件都绑定到同一个ViewModel。

网格可以绑定到您要显示的对象的集合(List<>),它还可以将其SelectedRow / SelectedItem属性绑定到ViewModel上名为SelectedItem(或类似)的相应属性。这意味着每次在网格中选择一行时,底层数据对象将填充到ViewModel上的属性中。

然后,将详细信息用户控件绑定到ViewModel上的相同SelectedItem属性。检查DataGrid和TextBox绑定到同一SelectedItem属性的这个非常简单的示例:

视图模型

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; }
    }
}

主窗口

<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),则数据网格中的行将使用新名称进行更新 - 全部通过绑定。

有关更多信息,之前有关于使用WPF的MVVM模式的Stack Overflow few thousand questionsmany of them specifically about master-detail views就像你想要的那样。

答案 1 :(得分:0)

在XAML标记中,只需将编辑面板的对象绑定到网格对象中的选定对象。