2013-01-07 37 views
1

Datagrid的数据我想在另一个窗口的文本框重复数据网格的数据。数据已保存在SQL数据库中,并希望基于单击一个数据网格行在新窗口中检索它们。 可以吗?负载WPF在另一个窗口的文本框中

<DataGrid Margin="0,23,0,0" AutoGenerateColumns="False" EnableRowVirtualization="True" 
        ItemsSource="{Binding}" Name="grdPeople" VerticalContentAlignment="Center" 
        IsReadOnly="True" DataContext="{Binding}"> 

      <DataGrid.Columns>     
       <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" Width="Auto" ></DataGridTextColumn> 
       <DataGridTextColumn Binding="{Binding Path=Job}" Header="Job" Width="Auto"></DataGridTextColumn> 
       <DataGridTemplateColumn Header="Picture" Width="45" > 
        <DataGridTemplateColumn.CellTemplate > 
         <DataTemplate > 
          <Image Source="{Binding Path=Picture}" Width="30" Height="30" Stretch="Uniform">         
          </Image> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

回答

1

既然你已经在使用数据绑定来填充DataGrid控件的细胞,通过在你的UI代码绑定到数据的结构洗牌(对象的DataContext的必然),你应该能够实现你的目标。

我把一个快速,简单的例子。我创建了MyViewModel类作为“绑定目标”,并使用MyView类来表示您的view/xaml。首先,与上面的代码类似,MyView有一个DataGrid。我还在DataGrid下面的同一个用户控件中添加了几个文本框。两个是来自所选项目的名称和作业字段。另外两个应该是你要根据用户的选择来填充等领域。例如,他们可能是当用户选择一行时从数据库中查找的额外数据。这里的MyView.xaml:

<UserControl x:Class="WpfApplication1.MyView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}" 
       IsReadOnly="True" SelectedItem="{Binding SelectedItem}" 
       SelectionMode="Single"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="Job" Binding="{Binding Job}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <StackPanel Orientation="Horizontal" Grid.Row="1"> 
     <TextBox Width="100" Text="{Binding SelectedItem.Name, Mode=OneWay}" Margin="2"/> 
     <TextBox Width="100" Text="{Binding SelectedItem.Job, Mode=OneWay}" Margin="2"/> 
     <TextBox Width="100" Text="{Binding ExtraStuff.ExtraIntegerField, Mode=OneWay}" Margin="2"/> 
     <TextBox Width="100" Text="{Binding ExtraStuff.ExtraDoubleField, Mode=OneWay}" Margin="2"/> 
    </StackPanel> 
</Grid> 

现在,DataGrid的绑定,绑定我的的ItemsSource到控制的DataContext的特定集合。所以在这里,DataContext不是集合本身,而是一个包含行和其他信息的项目的对象。我还将SelectedItem绑定到一个名为SelectedItem的属性,该属性应该有一个公共getter和setter。然后将MyView的DataContext设置为MyViewModel的一个实例。这里是MyViewModel.cs:

public sealed class MyViewModel : INotifyPropertyChanged 
{ 
    private readonly ObservableCollection<LightItem> _items = new ObservableCollection<LightItem>(); 

    private LightItem _selectedItem; 
    private ExtraInformation _extraStuff; 

    public MyViewModel() 
    { 
     this._items.Add(new LightItem("Tim", "Dish Washer")); 
     this._items.Add(new LightItem("Bob", "Window Washer")); 
     this._items.Add(new LightItem("Jill", "Widget Washer")); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ExtraInformation ExtraStuff 
    { 
     get { return this._extraStuff; } 
     private set 
     { 
      this._extraStuff = value; 
      this.OnPropertyChanged("ExtraStuff"); 
     } 
    } 

    public ReadOnlyObservableCollection<LightItem> Items { get { return new ReadOnlyObservableCollection<LightItem>(this._items); } } 

    public LightItem SelectedItem 
    { 
     get { return this._selectedItem; } 
     set 
     { 
      this._selectedItem = value; 
      this.OnPropertyChanged("SelectedItem"); 
      this.ExtraStuff = new ExtraInformation(value); 
     } 
    } 

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

    public sealed class ExtraInformation 
    { 
     private readonly double _extraDoubleField; 
     private readonly int _extraIntegerField; 

     public ExtraInformation(LightItem light) 
     { 
      // you could get more info for your record from the db 
      // but here we just get some random numbers 
      var rnd = new Random(); 
      this._extraDoubleField = rnd.NextDouble(); 
      this._extraIntegerField = rnd.Next(); 
     } 

     public double ExtraDoubleField { get { return this._extraDoubleField; } } 

     public double ExtraIntegerField { get { return this._extraIntegerField; } } 
    } 

    public sealed class LightItem 
    { 
     private readonly string _job; 
     private readonly string _name; 

     public LightItem(string name, string job) 
     { 
      this._name = name; 
      this._job = job; 
     } 

     public string Job { get { return this._job; } } 

     public string Name { get { return this._name; } } 
    } 
} 

这里,属性的SelectedItem是同一个,我们绑定到DataGrid中的SelectedItem依赖项属性。它的类型是我的Items集合中绑定到DataGrid的ItemsSource的相同类型的项目。现在,当SelectedItem的setter被调用时,不仅要更新它并引发PropertyChanged事件。我还构建一个新的ExtraInformation对象并将其分配给ExtrStuff。回顾一下MyView.xaml,你会发现底部的两个文本框的TextProperty绑定到了这个对象的整数和双字段。用户每次选择其中一个项目时,都会显示一组新的随机数字。

虽然这并不需要你在Google上查找从数据库中选择的项目信息,所有的方式,希望这点你在你如何能做到这清晰地使用WPF数据绑定正确的方向。文本字段所在的窗口无关紧要 - 在大多数情况下,您应该可以将两个窗口的DataContext都设置为相同的基础MyViewModel。这是这种方法的一个很酷的部分。 MyViewModel类封装了如何查找存储在数据库中关于所选项目的信息。 MyView只是看到它绑定的一些数据已更新,并让MyViewModel知道用户何时点击了DataGrid中的不同项目。真的,你在绑定目标中逻辑上构造了数据的外观。然后你只要告诉视图部分如何用绑定“闩锁”。这也意味着不同的观点可以以不同的方式“锁定”。也许Window1有一个绑定到Items的DataGrid,Window2的一些文本字段绑定到SelectedItem和ExtraStuff的两个信息,也许Window3有一个与SelectedItem关联的图像显示。每个窗口/视图只是绑定目标中的数据的不同视觉表示(这里是MyViewModel实例)。

这里有一个简单的图表演示的想法:

quick Paint diagram of data binding from two views to one viewmodel, on different windows

+0

我抛出了一个类似的例子,它实际上有两个窗口,这里有完整的源代码。如果您愿意,请随时查看。 https://github.com/tlantz/stackoverflow-answers/tree/master/MultiWindowMasterDetail/MultiWindowMasterDetail – timmyl

0

- 稠这种方法,取得了ChildWindow和使用LINQ to SQL类

<TextBox Width="100" Height="40" Name="txtName" Text="{Binding Name, UpdateSourceTrigger=Explicit}" 
       Margin="371,192,84,29"></TextBox> 
     <TextBox Width="100" Height="40" Name="txtFamily" Text="{Binding Family, UpdateSourceTrigger=Explicit}" 
       Margin="228,192,226,29"></TextBox> 

和主页按钮包含数据网格:

private void btnNewWin_Click(object sender, RoutedEventArgs e) 
     { 
      if (this.dataGrid1.SelectedItems.Count == 1) 
      { 
       ChildWindow chWin = new ChildWindow { Owner = this, DataContext = this.dataGrid1.SelectedItem }; 
       chWin.ShowDialog(); 

      } 
     } 

When Button被点击,数据显示在文本框上,但是当我通过这种方式添加图片,不工作!

相关问题