2013-10-07 29 views
0

我有一些Datagrid與一些列。它綁定到一個對象列表。 其中一列是一個文本列:我需要它作爲「驗證」列,事實上,我希望對於每一行,此單元格的值是「OK」或「NOT OK」,基於其他值存在細胞。我不知道如何將一個字符串寫入到Datagrid的某個單元格中。 有什麼建議嗎?wpf datagrid:在文本框列中寫入值

編輯: 描述DataGrid的對象類以下

public class BracketProperty 
{ 
    [XmlAttribute] 
    public int index { get; set; } 
    public BracketType type { get; set;} 
    public List<BracketPoint> bracketPointsList; 
    [XmlIgnore] 
    public String isPointSelectionEnded { get; set; } 
} 

EDIT2: 有人告訴我,這行代碼是不好

this.BracketsDataGrid.ItemsSource = this.currentPropertyToShow.sides[this.sideIndex - 1].brackets; 

其中brackets被定義爲

public ObservableCollection<BracketProperty> brackets; 

因爲不是一個綁定...我怎麼能改變它是一個綁定?

回答

1

要做到這一點,最簡單的方法是創建具有public屬性在DataGrid每列數據類型的類。你應該在這個類中實現INotifyPropertyChanged接口。

然後你就可以擁有它,你可以在一個PropertyChanged處理器更新屬性:

private void YourDataType_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (Property1 == "SomeValue" && Property2 > 0) ValidationProperty = "OK"; 
    else ValidationProperty = "NOT OK"; // Add your own condition above of course 
} 

在構造函數中:

PropertyChanged += YourDataType_PropertyChanged; 
+0

我已經有一個DataGrid的每列的公共屬性的數據類型類(我在上面的問題中添加了它)。問題是,如果我在該類中實現INotifyPropertyChanged,它會在啓動時引發異常,因爲字段isPointSelectionEnded上的循環。我如何以適當的方式實現接口?請注意,我在不同的課程之間進行工作。 – FrancescoDS

+0

在我的回答中,我提供了一個鏈接到MSDN上的INotifyPropertyChanged頁面(第2行)......單擊它並按照該頁面上的幫助。 – Sheridan

+0

如果我實現INotifyPropertyChanged,並在setter中將值更改爲「Not ok」,則值會更改,但網格不會自動更新...並且我看到舊值...執行項目刷新?我問它是因爲隨機引發了一個異常,例如「在AddNew或EditItem事務中不允許刷新」 – FrancescoDS

0

利用價值轉換

public partial class MainWindow : Window 
{ 
    public ObservableCollection<Employee> EmpList { get; set; } 
    public MainWindow() 
    { 

     InitializeComponent(); 
     this.DataContext = this; 
     EmpList = new ObservableCollection<Employee> { 
      new Employee(1, "a"), 
      new Employee(2, "b"), 
      new Employee(3, "c") }; 
    } 
} 

public class NumValueConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int v = int.Parse(value.ToString()); 
     if (v < 3) 
      return "YES"; 
     else 
      return "NO"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class Employee 
{ 
    public int Salary { get; set; } 
    public string Name { get; set; } 

    public Employee(int s, string n) 
    { 
     Salary = s; 
     Name = n; 
    } 
} 

XAML

<Window x:Class="garbagestack.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cv="clr-namespace:garbagestack" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <cv:NumValueConverter x:Key="cv1"/> 
     </Grid.Resources> 
     <DataGrid AutoGenerateColumns="False" Margin="12,99,12,12" Name="dg1" ItemsSource="{Binding EmpList}" > 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="NewValue" Binding="{Binding Salary}"/> 
       <DataGridTextColumn Header="NewValue" Binding="{Binding Name}"/> 
       <DataGridTextColumn Header="NewValue" Binding="{Binding Salary,Converter={StaticResource cv1}}"> 

       </DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
+0

問題是基於其他列中的值 – Paparazzi

0

我需要回答關於我自己的問題。我還沒有實現任何INotifyPropertyChanged接口或轉換器...添加唯一碼,設定用於控制的變量的值之後,如下:

this.DataGrid.Items.Refresh(); 

和文本在網格顯示正確...

但是,最好按照MVVM模式規則實現INotifyPropertyChanged。