2011-10-19 61 views
0

我在Datagrid中有一個奇怪的問題。我使用WPF與DataBinding,我有一個DataGrid,並在一個頁面中的3個按鈕 - 保存,更新,取消 - 和很多標籤。這些標籤,當用戶點擊更新按鈕時,將啓用這些標籤的編輯模式。DataGrid集屬性,但沒有得到改變的價值SelectedIndex

在編輯模式下,該用戶無法更改該網格的SelectedIndex(這是我的問題)。 我試圖創建一個屬性IsNotEditable,綁定到該DataGrid的IsEnabled =「」,但如果它被禁用,則當前行未被選中。

我不能使用它,因爲當用戶點擊保存時,我會保存選定的行。 所以...我創建另一個屬性PlacasSelectedItem和「支持」屬性PlacasSelectedAux,使用此代碼:

public ConeSlab PlacasSelectedAux { get; set; } 

    private ConeSlab placasSelectedItem; 
    public ConeSlab PlacasSelectedItem 
    { 
     get { return placasSelectedItem; } 
     set 
     { 
      if (CurrentEditMode == EditMode.View) 
      { 
       placasSelectedItem = value; 
       PlacasSelectedAux = value; 
       OnPropertyChanged("PlacasSelectedItem"); 

       if (PlacasSelectedItem != null) 
        PlacaQuenteIsChecked = StringUtil.ConvertYesNoToBoolean(PlacasSelectedItem.Slab.InfHotSlab); 
       else 
        PlacaQuenteIsChecked = false; 

       ExibeLaminadorDestino(); 
      } 
      else if (CurrentEditMode != EditMode.View) 
      { 
       // if isn't in ViewMode, and if user clicks in another Row, will force previously row to be selected. 
       placasSelectedItem = PlacasSelectedAux; 
       OnPropertyChanged("PlacasSelectedItem"); 
      } 
     } 
    } 

好了,現在奇怪的問題:它執行的代碼,我看到的變化代碼,但SelectedIndex不會更改!數據綁定不起作用!

這裏是我的綁定:

<DataGrid SelectedItem="{Binding Path=PlacasSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

感謝您的幫助!您的網格

+0

讓我得到這一點,你有一個可編輯的數據網格,你選擇一行,並將其中一個單元格編輯模式。現在根據你的問題是用戶不允許將該行的選擇更改爲另一行?我對麼? –

回答

0
  1. 由於項目能是一個隨時更改,訪問您(此時)更安全的方法,從UI到模型中,發現在控制一個實際的行。 你可以嘗試使用擴展方法,像這樣:

    public static DataGridRow GetSelectedRowFromGrid(this DataGrid myDataGrid) 
    { 
    
        return (DataGridRow) 
         myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem); 
    } 
    
  2. 在我看來,(希望我正確理解你的應用程序的工作流程),你就行數據必須被綁定到模型,所以用戶在更改行內容時,最多需要DataBinding負責修改鏈接模型對象下方的內容,並且在此之後,您實際需要的唯一東西就是保存您的模型對象,,因此不需要任何UI訪問

希望這會有所幫助。

+0

感謝您的回答,但我忘了告訴一些事情......我使用的是MVVM,而且我不想使用代碼隱藏功能,所以我需要使用屬性來執行此操作。我想如果我可以阻止導航到Datagrid,它可以解決問題。 –

+0

@gustavosg:使用提供的代碼,可能足以讓您保存編輯開始的行。 – Tigran

+0

好的,問題解決了。進入xaml: IsHitTestVisible =「{Binding Path = IsEditing,Mode = OneWay,UpdateSourceTrigger = PropertyChanged,Converter = {StaticResource InverseBooleanConverter}}」 「此反轉布爾值禁用更改Datagrid行選擇。 –

0

好的,問題解決了。進入XAML的數據網格:

IsHitTestVisible="{Binding Path=IsEditing, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBooleanConverter}}" 

創建靜態資源:

<Page.Resources> 
    <ut:InverseBooleanConverter x:Key="InverseBooleanConverter" /> 

    <Page.Resources> 

這將逆布爾值禁用改變DataGrid行選擇,使用這種方法:

/// <summary> 
/// Convert bool to !bool 
/// </summary> 
[ValueConversion(typeof(Boolean), typeof(Boolean))] 
public class InverseBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     return !(Boolean)value; 
    } 

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

現在用戶無法在DataGrid中選擇任何其他行! 感謝您的幫助:)