2011-10-19 3 views
0

Datagrid에서 이상한 문제가 있습니다. 나는 DataBinding과 함께 WPF를 사용하고 있으며, DataGrid와 페이지에 3 개의 버튼 - 저장, 업데이트, 취소 - 및 많은 레이블이 있습니다. 이 레이블은 사용자가 업데이트 버튼을 클릭하면이 레이블에 대한 편집 모드를 활성화합니다.DataGrid가 속성을 설정하지만 변경할 값이 없습니다. SelectedIndex

편집 모드에서 해당 사용자는 해당 그리드의 SelectedIndex를 변경할 수 없습니다 (내 문제 임). 속성 IsNotEditable, 해당 DataGrid의 IsEnabled = ""에 바인딩을 만들려고했으나 비활성화 된 경우 현재 행이 선택 취소되었습니다.

저장을 클릭하면 선택한 행이 저장되므로 사용할 수 없습니다.

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"); 
      } 
     } 
    } 

좋아, 이제 이상한 문제 : 그래서 ...이 코드와 다른 속성 PlacasSelectedItem하고, '지원'속성 PlacasSelectedAux을 만든 것은 내가 변화를 참조 코드를 실행 코드,하지만 SelectedIndex 변경되지 않습니다! 데이터 바인딩이 작동하지 않습니다! 여기

내 바인딩되어 어떤 도움

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

감사합니다! 그리드에

+0

편집 할 수있는 DataGrid가 있으며 행을 선택하고 셀 중 하나를 편집 모드로 지정하십시오. 이제 문제에 따라 사용자가 해당 행에서 다른 행으로 선택을 변경할 수 없습니까? 나 맞아? –

답변

0
  1. 으로 항목 모델 UI에서 (이 시점에서) 당신의 에 액세스 할 수있는, 더 안전한 방법을 변경하는 대상이 될 수 있으며, 컨트롤에 실제로 행을 찾는 것입니다. 이 같은 확장 방법을 사용하는 뭔가를 시도 할 수 있습니다 :

    public static DataGridRow GetSelectedRowFromGrid(this DataGrid myDataGrid) 
    { 
    
        return (DataGridRow) 
         myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem); 
    } 
    
  2. 그것은 나 (내가 바로 앱 흐름을 이해 바랍니다)에 보인다 행의 데이터가 모델에 바인더 제본되어야한다는, 그래서 사용자가 때 모델 객체, 은 그래서 어떤 UI 액세스가 필요하지를 저장하기 위해서는 아래 링크 된 모델 객체를 변경 돌봐 DataBinding까지, 그리고 그 이후, 유일한 것은 당신이 실제로 필요합니다, 행 내용입니다 변경.

희망이 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 뭔가를 말한 것을 잊어 버렸습니다 ... MVVM을 사용하고 있으며 코드 숨김을 사용하고 싶지 않으므로 속성을 사용해야합니다. 데이터 그리드 내비게이션을 차단할 수 있다면 문제를 해결할 수있을 것 같습니다. –

+0

@gustavosg : 제공된 코드를 사용하여 편집이 시작되는 행을 저장하면 충분할 수도 있습니다. – Tigran

+0

좋습니다. 문제가 해결되었습니다. IsHitTestVisible = "{바인딩 경로 = IsEditing, 모드 = OneWay, UpdateSourceTrigger = PropertyChanged, 변환기 = {StaticResource InverseBooleanConverter}}" 이 값은 부울 값을 역으로 변경하여 Datagrid 행 선택을 변경할 수 없도록합니다. –

0

확인. 문제가 해결되었습니다.

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

정적 자원을 만든 : 다음 XAML의에서 Datagrid에

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

    <Page.Resources> 

이이 방법을 사용하여 데이터 격자 행 선택을 변경하지 않으려면 부울 값을 반전됩니다 이제

/// <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에서 다른 행을 선택할 수 없습니다. 도와 줘서 고마워.

관련 문제