2013-12-07 24 views
0

我是wpf的新手,我需要使用WPF DataGrid,它的ItemSource設置爲Model的ObservableCollection,其中Model實現IDataErrorInfo類。 我面臨的問題是,如果模型返回任何屬性的驗證字符串,則用戶無法退出單元格的編輯模式,我試過回滾&我甚至嘗試過CancelEdit,但是我無法退出編輯模式。我在msdn上搜索,我發現它的DataGrid屬性之一,但我需要做一些相同的應用程序的要求。取消在WPF DataGrid中的編輯模式,即使驗證觸發

我的模型類:

public class Model: IDataErrorInfo 
{ 
    public int PropertyName{ get; set; } 

    // other properties & methods removed for clarity 

    public string this[columnName] 
    { 
     get 
     { 
      if (PropertyName< 0) 
       return "Error Message"; 
      else 
       return string.Empty; 
     } 
    } 
} 

現在如果「屬性名」小於0,用戶不能離開特定小區的編輯模式。

This link on msdn說,在「備註」是

數據網格將不會退出單元格編輯模式,直到驗證 錯誤得到解決。

即使驗證返回錯誤消息,是否有任何解決方法可以退出單元格編輯模式?我無法幫助代碼架構,因爲我被DataGrid以及'Model'類困住了。任何幫助將不勝感激,非常感謝。

+0

如果您更改單元格返回到上一個有效狀態用戶如何得到通知他做錯了什麼。他可能會一直重複在單元格中設置-1,但它總是會變回0.(如果0是編輯前的當前值)。你真的想要這個嗎? –

+0

基本上它是我的應用程序需求的一小部分..有一個錯誤列表,用戶選擇一個錯誤,焦點自動轉到該元素,現在如果用戶選擇網格中的其他錯誤,焦點不會改變,因爲舊的錯誤不是固定的,但我希望焦點更改爲新的選定錯誤,並且網格不允許更改編輯元素。 (我正在使用WPF工具包網格)。如果舊錯誤得到解決,我能夠改變焦點。 – rmagon

+0

但是你永遠不會添加任何項目到錯誤列表中,因爲在離開單元格之前需要首先修復單元格中的錯誤。所以又是什麼意思。告訴我們更多信息爲什麼你這樣做。也許我們會爲你找到更好的建議。你正在談論的名單永遠不會被填補。 –

回答

3

使用IdataErrorInfo驗證WPF DataGrid, 直到驗證錯誤得到解決,DataGrid纔會退出單元格編輯模式。

這是事實,但可以用變通解決 - 使用在DataGridTemplateColumn.CellEditingTemplate和DataGridTemplateColumn.CellTemplate的文本框。

定義一個DataTemplate的數據網格

<DataGrid.Resources> 
    .... 
    <DataTemplate x:Key="EditingValueTemplate"> 
     <TextBox Text="{Binding bindingProp, ValidatesOnDataErrors=True}" 
            FocusManager.FocusedElement="{Binding RelativeSource= {RelativeSource Self}}"/> 
    </DataTemplate> 
</DataGrid.Resources> 

分配該數據模板數據網格的CellTemplate和CellEditingTemplate

<DataGrid.Columns> 
<DataGridTemplateColumn Header="Value" CellTemplate="{StaticResource EditingValueTemplate}" 
             CellEditingTemplate="{StaticResource EditingValueTemplate}" /> 
</DataGrid.Columns> 

如果你想分配刀尖顯示錯誤兩種情況即單元格編輯模式和鼠標懸停單元格。 你需要一個風格

<Style x:Key="DatagridCellToolTip" TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
</Style.Triggers> 
</Style> 

,包括這種風格也與上述數據網格即

<DataGrid.Columns> 
    <DataGridTemplateColumn Header="Value" CellTemplate="{StaticResource EditingValueTemplate}" 
              CellEditingTemplate="{StaticResource EditingValueTemplate}" 
              CellStyle="{StaticResource DatagridCellToolTip}"/> 
</DataGrid.Columns> 
+0

是的,我試過了,但有沒有解決方法使用DataGridTextColumn相同? (因爲至少你有意答案) – rmagon

+0

據我所知,如果有驗證錯誤,並且單元格是編輯模式,那麼DataGrid將單元格的其餘部分鎖定爲不可編輯或者說單元格按照每個基於CellTemplate定義的行爲在TextBlock上,而不是在TextBox上。 DataGridTextColumn使用默認的cellTemplate定義,所以我們不得不使用DataGridTemplateColumn並強制使用TextBox。儘管我的知識有限。 – vijay

+0

我對DataGridTextColumn的體驗是,即使出現驗證錯誤,Esc鍵也會取消編輯。我想在CellEditingTemplate中使用DatePicker在DataGridTemplateColumn中獲取相同的行爲。 (http://stackoverflow.com/q/37029641/107037) – Number8

1

我只是一致認識到這一點。

當您將每個DataGridTextColumn替換爲TemplateColumn並且僅僅使您綁定到TextBox時,即使錯誤未修復,您也可以在每個TextBox之間跳轉並編輯多行。

<DataGridTemplateColumn Header="Sample" Width="1*"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
       <TextBox.Text> 
        <Binding Path="SampleB" UpdateSourceTrigger="PropertyChanged"> 
         <Binding.ValidationRules> 
          <vm:CellDataInfoValidationRule ValidationStep="UpdatedValue"/> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn>