2013-01-23 42 views
0

我已经定义了下面的XAML。该绑定填充了DataGridComboBoxColumn,如果我同时在组合框中选择PartNumber,则需要在DataGridTextColumn中绑定另一个属性(PartName)值。我怎么能在DataGridTextColumn中做这个绑定?如何在Datagrid中定义依赖关系绑定

<Window.Resources> 
    <ObjectDataProvider x:Key="RecordValues" 
         ObjectType="{x:Type local:RecordTemp}" 
         MethodName="GetPersonList"> 
    </ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <Grid> 
    <DataGrid AutoGenerateColumns="False" 
       ItemsSource="{Binding}" 
       Margin="10" 
       Name="dataGrid1"> 
     <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Combo" 
           Width="300" 
           SelectedItemBinding="{Binding Values}" 
           DisplayMemberPath="PartNumber" 
           ItemsSource="{Binding Source={StaticResource RecordValues}}" /> 
     <DataGridTextColumn Header="Order Name" 
          Binding="" /> 
     </DataGrid.Columns> 
    </DataGrid> 
    </Grid> 
</Grid> 

在下面的代码定义的C#,要完成这一

ObservableCollection<RecordTemp> RecordsTemp = new ObservableCollection<RecordTemp>(); 

    RecordsTemp.Add(new RecordTemp()); 
    RecordsTemp.Add(new RecordTemp()); 
    dataGrid1.DataContext = RecordsTemp; 


    public class RecordTemp 
    { 
    List<PartsList> _value = new List<PartsList>(); 

     public RecordTemp() 
    { 
     _value.Add(new PartsList() { PartName = "One", PartNumber = "1", PartQuantity = 20 }); 
     _value.Add(new PartsList() { PartName = "Two", PartNumber = "2", PartQuantity = 10 }); 
    } 

    public List<PartsList> value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 

    public List<PartsList> GetPersonList() 
    { 
     return _value; 
    } 
    } 

public class PartsList 
    { 
     public string PartName { get; set; } 
     public double PartQuantity { get; set; } 
     public string PartNumber { get; set; } 
    } 

回答

1

一种方法是

  1. 添加在RecordTemp类一个新的属性(比如属性名是SelectedPart),这将存储选定的PartList obj。

  2. 将SelectedPart属性绑定到ComboBox的SelectedValue属性。

  3. 将SelectedPart绑定到文本框。

  4. 现在,RecordTemp类应实现INotifyPropertyChanged接口,以便在用户更改ComboBox值时更新UI。

以下是我对代码所做的修改。

<DataGrid AutoGenerateColumns="False" 
      ItemsSource="{Binding}" 
      Margin="10" 
      Name="dataGrid1" 
      CanUserAddRows="False"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Header="Combo"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox SelectedValue="{Binding SelectedPart, UpdateSourceTrigger=PropertyChanged}" 
        DisplayMemberPath="PartNumber" 
        ItemsSource="{Binding Source={StaticResource RecordValues}}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    <DataGridTextColumn Header="Order Name" 
         Binding="{Binding SelectedPart.PartName}" /> 
    </DataGrid.Columns> 
</DataGrid> 

代码在文件后面。您可能必须更改名称空间。

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; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      ObservableCollection<RecordTemp> RecordsTemp = new ObservableCollection<RecordTemp>(); 

      RecordsTemp.Add(new RecordTemp()); 
      RecordsTemp.Add(new RecordTemp()); 
      dataGrid1.DataContext = RecordsTemp; 
     } 
    } 

    public class RecordTemp : INotifyPropertyChanged 
    { 
     List<PartsList> _value = new List<PartsList>(); 

     public RecordTemp() 
     { 
      _value.Add(new PartsList() { PartName = "One", PartNumber = "1", PartQuantity = 20 }); 
      _value.Add(new PartsList() { PartName = "Two", PartNumber = "2", PartQuantity = 10 }); 
     } 

     public List<PartsList> value 
     { 
      get { return _value; } 
      set { _value = value; } 
     } 

     private PartsList _SelectedPart; 

     public PartsList SelectedPart 
     { 
      get { return _SelectedPart; } 
      set 
      { 
       _SelectedPart = value; 
       OnPropertyChanged("SelectedPart"); 
      } 
     } 

     public List<PartsList> GetPersonList() 
     { 
      return _value; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

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

    public class PartsList 
    { 
     public string PartName { get; set; } 
     public double PartQuantity { get; set; } 
     public string PartNumber { get; set; } 
    } 
} 
+0

优秀的一个..谢谢 – Smaug