2010-08-14 2 views
1

저는 실버 라이트가 처음이에요. 이것이 확실한 것인지 아닌지 잘 모르겠습니다.DataGrid에서 프로그래밍 방식으로 제어를 활성화/비활성화하는 적절한 방법은 무엇입니까?

첫 번째 열이 "재정의 됨"이라는 확인란의 첫 번째 열인 DataGrid가 있습니다. 두 번째 열 ("ShowDetails")은 사용자가 행을 확장하여 중첩 된 격자를 볼 수있게 해주는 버튼입니다. "재정의"확인란을 선택하지 않으면 "ShowDetails"버튼을 비활성화해야합니다.

처음 표시 될 때 화면이 올바른 것입니다. 초기 "재 지정"확인란의 선택을 취소하면 "ShowDetails"버튼이 비활성화됩니다. "Overridden"확인란을 선택하면 "overriddenFlag"가 변경되지만 'ShowDetails'버튼은 'enabled'로 변경되는 대신 비활성화 상태로 유지됩니다.

"ShowDetails"단추의 "IsEnabled"플래그가 변경되지 않는 이유는 무엇입니까? 여기

는 XAML

 <sdk:DataGrid.Columns> 

      <sdk:DataGridTemplateColumn Header="Overridden"> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding OverriddenFlag,Mode=TwoWay}" 
          Click="Overridden_Click" 
          HorizontalAlignment="Center" 
         /> 
       </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 

      <sdk:DataGridTemplateColumn> 
       <sdk:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button x:Name="ShowDetails" 
          FontWeight="bold" FontSize="12" 
          Content="+" Click="ShowDetails_Click" 
          IsEnabled="{Binding OverriddenFlag, Mode=OneWay}" 
           /> 
        </DataTemplate> 
       </sdk:DataGridTemplateColumn.CellTemplate> 
      </sdk:DataGridTemplateColumn> 

프로그래밍 방식으로 데이터 그리드에서 버튼을 활성화/비활성화하는 적절한 방법은 무엇입니까에서 2 열입니까?

스택 오버플로에서 INotifyProperty와 같은 버튼을 숨기는 변환기 (확인란을 선택했을 때 단추가 표시되지 않음)와 같은 다양한 작업을 시도했습니다. FindName()과 같은 Overridden_Click fct에서 작업을 시도했지만 성공하지 못했습니다.

답변

2

가장 큰 문제는 행이 바인딩 된 개체가 INotifyPropertyChanged을 구현하지 않는다는 것입니다. 이 인터페이스를 구현하지 않으면 단추가 OverriddenFlag 속성에 대한 확인란의 변경 내용을 알 수있는 방법이 없습니다.

다음은 그 수행하는 방법의 예입니다 : -

public class MyClass : INotifyPropertyChanged 
{ 

    private bool _overriddenFlag; 
    public bool OverriddenFlag 
    { 
     get { return _overriddenFlag; } 
     set 
     { 
      _overriddenFlag= value; 
      NotifyPropertyChanged("OverriddenFlag"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 
+0

트릭을했다가, 감사합니다! 당신은 정말로 내 학습 곡선을 도왔습니다. 정말 고맙습니다. – Karen

+0

FYI : 다른 사람이 동일한 곤경에 빠진 경우를 대비하여 마지막 의견이 하나 있습니다. INotifyPropertyChanged를 사용하여 시도했지만 작동하지 않았습니다. 나는 mode = TwoWay가 없다고 생각한다. 퍼즐 조각을 제자리에 떨어 뜨리는 데 도움을 주신 것에 대해 다시 한 번 감사드립니다. – Karen

관련 문제