2011-03-26 47 views
4

我遇到了一個小問題,我嘗試將DataGrid的DataTextColumn綁定到計算字段。DataBinding到計算字段

WPF

<DataGrid ItemsSource="{Binding Path=CurrentRoster, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
      AutoGenerateColumns="False" 
      AlternatingRowBackground="Gainsboro" 
      AlternationCount="2"> 
    <DataGrid.Columns> 
    <DataGridComboBoxColumn Header="Student Enrolled" 
          ItemsSource="{Binding Source={StaticResource AvailableStudents}}" 
          SelectedItemBinding="{Binding Path=Student}"> 
    </DataGridComboBoxColumn> 
    <DataGridTextColumn Header="Registration" Binding="{Binding Path=RegistrationCosts, StringFormat='{}{0:C}'}"/> 
    <DataGridTextColumn Header="Lodging" Binding="{Binding Path=LodgingCosts, StringFormat='{}{0:C}'}"/> 
    <DataGridTextColumn Header="Travel" Binding="{Binding Path=TravelCosts, StringFormat='{}{0:C}'}"/> 
    <DataGridTextColumn Header="Dining" Binding="{Binding Path=DiningCosts, StringFormat='{}{0:C}'}"/> 
    <DataGridTextColumn Header="Total Costs" IsReadOnly="True" Binding="{Binding Path=TotalCosts, StringFormat='{}{0:C}'}"/> 
</DataGrid.Columns> 

如果學生是一個小的添加實體對象。 TotalCosts不是數據庫表中的字段,所以我爲此創建了部分類。

public partial class Student 
{ 
    public Decimal TotalCosts 
    { 
     get { return (LodgingCosts + RegistrationCosts + TravelCosts + DiningCosts); } 
    } 
} 

我遇到的問題是TotalCosts在填寫任何其他字段時不會自動更新。我猜這是因爲它沒有列爲依賴項屬性。如何解決這個問題,對於沒有設置的房產?

回答

3

您可以在TotalCosts取決於每個屬性的setter方法調用OnPropertyChanged("TotalCosts"),這將刷新綁定

+0

ü爲什麼要回答這個問題我回答後? – 2011-03-26 16:36:37

+0

爲什麼不呢?這不是同一個答案(儘管它也使用OnPropertyCHanged)。我認爲最好在setter中做,而不是處理PropertyChanged事件。我不喜歡訂閱我自己的活動的想法... – 2011-03-26 16:39:40

+1

是的。現在我注意到了。我假設學生是自動生成的,因此你不能改變Setters。我更喜歡你的想法,但99%的時間不適用(當使用EF,WCF等) – 2011-03-26 16:50:47

3

我假設學生實現INotifyPropertyChanged。你必須做的是註冊PropertyChanged事件的LodgingCosts + RegistrationCosts + TravelCosts + DiningCosts,並引發TotalCosts的PropertyChanged事件。

public partial class Student 
{ 
    public Decimal TotalCosts 
    { 
     get { return (LodgingCosts + RegistrationCosts + TravelCosts + DiningCosts); } 
    } 

    public Student() 
    { 
     this.PropertyChanged += new PropertyChangedEventHandler(Student_PropertyChanged); 
    } 

    void Student_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "LodgingCosts" || 
      e.PropertyName == "RegistrationCosts" || 
      e.PropertyName == "TravelCosts" || 
      e.PropertyName == "DiningCosts") 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("TotalCosts")); 
     } 
    } 

} 
0

你需要實現類上的INotifyPropertyChanged。這裏是例子:

public class Person : INotifyPropertyChanged 
{ 
    //public int Id 
    //{ get; set; } 

    //public string Name { get; set; } 

    private int _Id; 

    public int Id 
    { 
     get { return _Id; } 
     set { _Id = value; 
     RaisePropertyChanged("Id"); 
     } 
    } 

    private string _EmpNo 
    { 
     get 
     { 
      return Id.ToString() + Name.ToString(); 
     } 
    } 

    private string _Name; 

    public string Name 
    { 
     get { return _Name; } 
     set 
     { 
      _Name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 

    private void RaisePropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

XAML代碼:

<DockPanel> 
    <TextBox Text="{Binding P1.Id}" Height="50" Width="100" DockPanel.Dock="Top" /> 
    <TextBox Text="{Binding P1.Name}" Height="50" Width="100" DockPanel.Dock="Top" /> 
    <Button Content="OK" Click="Button_Click" DockPanel.Dock="Bottom"/> 
</DockPanel> 

測試:

public TestWindow() 
{ 
    InitializeComponent(); 

    this.DataContext = this; 
} 

private Person _P1 = new Person(); 

public Person P1 
{ 
    get { return _P1; } 
    set { _P1 = value; } 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 

} 

類型的東西在2 textboxes..and點擊按鈕看到了人的價值P1 ..u將找到計算的字段值.. 希望它可以幫助你.. 謝謝, BHavik

3

你好Ø想我可以幫你,我已經在SQLSERVER 數據的基礎上這個代碼,我有一個數據集的數據源,我的數據庫

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 TestDeDataGrid.TestDSTableAdapters; 

namespace TestDeDataGrid 
{ 

    public partial class MainWindow : Window 
    { 
     //private ICollection<TablaTest> registros; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      TestDS ds = new TestDS(); 
      TablaTestTableAdapter adapter = new TablaTestTableAdapter(); 
      adapter.Fill(ds.TablaTest); 


      TablaTestGrid.ItemsSource = ds.TablaTest.DefaultView; 
     } 


     private void TablaTestGrid_CurrentCellChanged(object sender, EventArgs e) 
     { 
      if ((String)(((DataGrid)sender).CurrentColumn.Header) == "A/B") 
       ((DataGrid)sender).CommitEdit(DataGridEditingUnit.Row, true); 
     } 
    } 
} 

有了這一招C的自動計算列例如,如果我在列A和列B中輸入10,然後我按Tab鍵移動到列C,並且值2自動出現 不需要單擊其他行,然後我在列A和B中輸入值 或按回車。列表C是表達式(ColumnaA/ColumnaB)和類型 System.Decimal的計算列。

而且還有我的XAML代碼:

<DataGrid Name="TablaTestGrid" Grid.Row="1" AutoGenerateColumns="False"      
       CurrentCellChanged="TablaTestGrid_CurrentCellChanged"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="ID" Binding="{Binding Path=IdTablaTest}" IsReadOnly="True"></DataGridTextColumn> 
      <DataGridTextColumn Header="Col A" Binding="{Binding Path=ColumnaA}"></DataGridTextColumn> 
      <DataGridTextColumn Header="Col B" Binding="{Binding Path=ColumnaB}"></DataGridTextColumn> 
      <DataGridTextColumn Header="A/B" Binding="{Binding Path=ColumnaC}" IsReadOnly="True" ></DataGridTextColumn>    
      <DataGridTextColumn Header="TestOnly"></DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid>