2012-01-11 2 views
0

I 클래스의 각 인스턴스 이름를 얻을 수 있도록 다음과 같은 열거는 3 상태 체크 박스에 열거 값을 바인딩

Enum NodeStatusTypes 
    Undefined 
    Grant 
    Deny 
End Enum 

과 내가 목록 상자에 클래스를 결합하는 것을 시도하고있다 permission 텍스트 상자 및 3- 상태 확인란에 바인딩 된 목록 상자에 항목이 있습니다. 아래의 코드는 permission 속성이 인 클래스 객체를 추가하면 확인란이 선택된다는 점에서 부분적으로 작동합니다. 그러나 나는 또한 그 허가을 거부하고 체크 박스가 "널 (null)"상태에 있어야 할 물체 (예를 들면의 IsChecked = "null이") 허가를정의되지 않은 때를 위해 선택하지 않은 것으로 체크 박스가 필요합니다. 문제가 ConverterParameter에있는 것이 거의 확실하지만이 문제를 처리하는 방법을 알 수 없습니다. ,

Public Function Convert(value As Object, targetType As System.Type, 
         parameter As Object, 
         culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert 

    Dim retVal As Object = Nothing; 
    Select Case value 
     Case NodeStatusTypes.Undefined 
      retVal = Nothing 
     Case NodeStatusTypes.Grant 
      retVal = True 
     Case NodeStatusTypes.Deny 
      retVal = False 
    End Select 

    Return retVal 

End Function 

컨버터 매개 변수가 많은 의미를하지 않는 것 : 올바른 구현은 다음과 같이 보일 것이다

Public Class EnumToTriStateConverter 
    Implements IValueConverter 

    Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
     Return value.Equals(parameter) 
    End Function 

    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack 
     Dim retVal As NodeStatusTypes = Nothing 
     Select Case value 
      Case Nothing 
       retVal = NodeStatusTypes.Undefined 
      Case True 
       retVal = NodeStatusTypes.Grant 
      Case False 
       retVal = NodeStatusTypes.Deny 
     End Select 
     Return retVal 
    End Function 

End Class 
+1

변환 코드도 공유 할 수 있습니까? – BigL

답변

1

: 여기

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel.Resources> 
        <l:EnumToTriStateConverter x:Key="TriConverter" /> 
       </StackPanel.Resources> 
       <CheckBox IsThreeState="True" IsChecked="{Binding Path=Permission, Converter={StaticResource TriConverter}, ConverterParameter={x:Static l:NodeStatusTypes.Grant}}" /> 
       <TextBlock Text="{Binding Path=Name}" /> 
       <TextBlock Text="{Binding Path=Permission}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

는 요청에 따라 컨버터 클래스 바인딩에서 제거 할 수 있습니다.

+0

완벽하게 작동했습니다. 나는 또한 ConvertBack에 대한 변경을했고 그 역시 효과가있다. – WhiskerBiscuit

+0

@WhiskerBiscuit :'ConvertBack'에는 어떤 변화가 필요 했습니까? 나는 그것이 처음부터 정확하다고 생각한다. –

관련 문제