2017-05-17 2 views
-1

일부 정수를 DataGrid 열의 ReadOnly 값으로 변환하려고합니다. 이를 위해, 나는 다음과 같은 일을 해요 :C#/WPF - 변환기가 호출되지 않습니다?

namespace TanulmanyiRendszer.Admin.ViewModel 
{ 
    public class GradeToReadOnlyConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      Boolean IsReadOnly = (Int32.Parse((String)value) < 2) ? true : false; 
      return IsReadOnly; 
     } 
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return null; 
     } 
    } 
} 

XAML보기

<Window x:Class="TanulmanyiRendszer.Admin.View.MainWindow" 
    <!-- ETC --> 
    xmlns:viewModel="clr-namespace:TanulmanyiRendszer.Admin.ViewModel" 
    Title="Courses" Height="600" Width="500"> 
     <Window.Resources> 
      <viewModel:GradeToReadOnlyConverter x:Key="converter" /> 
     </Window.Resources> 
     <!-- ETC --> 
     <DataGrid Name="studentGrid" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding Students, Mode=TwoWay}" > 
      <DataGrid.Columns> 
       <DataGridTextColumn IsReadOnly="{Binding StudentGrade, Converter={StaticResource converter}}" Header="Student's grade" Binding="{Binding StudentGrade}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
</Window> 

이, 그러나 전혀 작동하지 않습니다. 변환기는 절대로 호출되지 않습니다. 내가 여기서 무엇을 놓치고 있니?

+2

'Binding = "{Binding StudentGrade}"가 효과가 있습니까? – Clemens

+0

@Clemens 예, exaclty. 성적은 나타나지만 가치에 상관없이 편집 할 수 있습니다. –

+0

출력 창을 확인하십시오.이 오류가 발생합니다. 대상 요소에 대해 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다. BindingExpression : Path = StudentGrade; DataItem = null; 대상 요소는 'DataGridTextColumn'(HashCode = 15006601)입니다. 대상 속성이 'IsReadOnly'('Boolean'유형)입니다. 이유와 해결책은 다음에서 찾을 수 있습니다. http://stackoverflow.com/questions/7660967/wpf-error-cannot-find-governing-frameworkelement-for-target-element –

답변

0

그러나 이것은 전혀 작동하지 않습니다.

이것은 예상되는 동작입니다. 그 이유는 Datagrid 칼럼은 비주얼 트리의 일부가 아니기 때문에 Datagrid 칼럼이 Datagrid의 Datacontext에 연결되지 않은 이유입니다. 따라서 Datagrid Column의 IsReadOnly 속성을 사용한 바인딩은 작동하지 않습니다. 이 시나리오의 좋은 솔루션 (해킹/해결 방법)은 here입니다.

제공된 링크 솔루션에 대한 도움이 필요한 경우 알려주십시오.

1
<DataGridTextColumn Header="Student's grade" Binding="{Binding StudentGrade}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="IsHitTestVisible" Value="{Binding StudentGrade, Converter={StaticResource converter}}" /> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

DataGridCell의 스타일을 변경하십시오. Setter 속성이 'IsHitTestVisible'또는 'IsEnabled'일 수 있습니다.

0

여기에 무엇이 누락 되었습니까?

DataGridTextColumn 당신이 StudentGrade 소스 속성에 직접 IsReadOnly 속성을 결합 할 수 없음을 의미있는 DataContext을 상속하지 않는다는 사실. https://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ :

은보기에 대한 정보와 방법이 가능 Freezable에서 상속과 DataContext을 캡처하는 BindingProxy 클래스를 사용하여 문제를 해결할 수에 대한 @Thomas 레베의 블로그 게시물을 참조하시기 바랍니다.

단순히 열에 대해 맞춤 EditingElementStyle을 정의하는 것이 더 쉽습니다. 이것을 시도하십시오 :

<DataGridTextColumn IsReadOnly="{Binding StudentGrade, Converter={StaticResource converter}}" 
        Header="Student's grade" Binding="{Binding StudentGrade}"> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding StudentGrade, Converter={StaticResource converter}}" Value="True"> 
        <Setter Property="BorderThickness" Value="0" /> 
        <Setter Property="IsEnabled" Value="False" /> 
        <Setter Property="Background" Value="Transparent" /> 
        <Setter Property="TextWrapping" Value="Wrap" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 
</DataGridTextColumn> 
관련 문제