2014-11-14 6 views
2

연결, 연결 해제 및 보류중인 3 개의 응용 프로그램이 있습니다. 통신 상태는 다른 일부 매개 변수에 의해 제어됩니다. IValueConverter에 의해 제어되는 화면에 해당 이미지를 표시하고 싶습니다. 그러나 나는 그것을 작동시키지 못한다.IValueConverter 및 가시성

public class CommunitationStateToVisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, string language) 
     { 
      var result = Visibility.Collapsed; 

      if ((string)parameter == "ConverterParameterConnected") 
       result = (CommunitationState)value == CommunitationState.Connected ? Visibility.Visible : Visibility.Collapsed; 

      if ((string)parameter == "ConverterParameterDisconnected") 
       result = (CommunitationState)value == CommunitationState.Disconnected ? Visibility.Visible : Visibility.Collapsed; 

      if ((string)parameter == "ConverterParameterPending") 
       result = (CommunitationState)value == CommunitationState.Pending ? Visibility.Visible : Visibility.Collapsed; 
      Debug.WriteLine("value={0}, parameter={1}, result={2}", value, (string)parameter, result); 
      return result; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, string language) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

: 여기

<Image x:Name="connectedImage" 
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterConnected}" 
    Source="Assets/connected.png" 
    Stretch="None" 
    HorizontalAlignment="Center" /> 



<Image x:Name="disconnectedImage" 
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterDisconnected}" 
    Source="Assets/disconnect.png" 
    Stretch="None" 
    HorizontalAlignment="Center" /> 


<Image x:Name="pendingImage" 
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterPending}" 
    Source="Assets/pending.png" 
    Stretch="None" 
    HorizontalAlignment="Center" /> 

public enum CommunitationState { Connected, Disconnected, Pending } 

public CommunitationState ConnectionWithServerEstablished 
{ 
    get 
    { 
     if (IRCommandSent) 
      return CommunitationState.Disconnected; 

     if (wifiConnected && !fcConnected) 
      return CommunitationState.Pending; 

     return wifiConnected ? CommunitationState.Connected : CommunitationState.Disconnected; 
    } 
} 

그리고 마지막으로 컨버터를 CommunitationState

제어 Methos는 다음과 같습니다

을 Heres는 3 개 이미지 광고 등의 내 XAML 코드 데이터 바인딩은 예상대로 작동합니다. 나는 확실히 텍스트 상자를 텍스트로 상태를 표시하는 다른 메서드에 묶어 놓았습니다. 내 컨버터가 호출되면, 나는 그것에 브레이크 포인트를 둘 수 있기 때문에 확실히 알고있다.

그래서 내 변환기에는 항상 잘못된 것이 있습니다. 왜냐하면 나는 항상 붕괴 된 이미지로 끝나기 때문입니다.

value=Connected, parameter=ConverterParameterConnected, result=Visible 
value=Connected, parameter=ConverterParameterDisconnected, result=Collapsed 
value=Connected, parameter=ConverterParameterPending, result=Collapsed 

I 보류로 변경 :

value=Pending, parameter=ConverterParameterConnected, result=Collapsed 
value=Pending, parameter=ConverterParameterDisconnected, result=Collapsed 
value=Pending, parameter=ConverterParameterPending, result=Visible 

는 **** 여기에 편집 ****

내가 연결 시작

제의 Debug.WriteLine에서 일부 출력

시작 대기 중 :

value=Connected, parameter=ConverterParameterConnected, result=Visible 
value=Connected, parameter=ConverterParameterDisconnected, result=Collapsed 
value=Connected, parameter=ConverterParameterPending, result=Collapsed 
value=Pending, parameter=ConverterParameterConnected, result=Collapsed 
value=Pending, parameter=ConverterParameterDisconnected, result=Collapsed 
value=Pending, parameter=ConverterParameterPending, result=Visible 

내 프로그램이 기본적으로 연결되어 있고 잠시 후에 TCP 서버를 볼 수는 없지만 Wifi에 대한 액세스 권한이 있으므로 계속 상태가 보류 중으로 변경되기 때문에 이는 맞습니다.

+0

Visibility = Visible을 바인딩 대신 XAML에 넣으면 이미지가 표시됩니까? 또한 디버거를 사용하여 가치 변환기를 단계별로 실행하십시오. – helb

+0

나는 그것을 시도한 havent, 내가 하드 코드를 Visibility.Visible 반환하고 이미지를 표시하려고 노력했다. –

+0

Convert() 내에서 디버거가 표시하는 매개 변수 값은 무엇입니까? – helb

답변

1

귀하의 의견을 통해 귀하의 ConnectionWithServerEstablished 속성이 변경되어 이미지가 보이게하거나 속성 값이 변경되었을 때 PropertyChanged 이벤트가 발생하지 않을 가능성이 큽니다.

당신은 당신의 의존 속성의 세터에서 이벤트를 발사하여, 예를 들어이 작업을 수행 할 수 있습니다

public bool IRCommandSent 
{ 
    set 
    { 
     // set the value 
     // ... 

     // notify event listeneers that the ConnectionWithServerEstablished may have changed 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("ConnectionWithServerEstablished")); 
     } 
    } 
} 

당신의 DataContext (당신의 ViewModel)으로 사용하는 클래스는 물론 그것에 대한 INotifyPropertyChanged를 구현해야합니다.

+0

내 lates 주석에서 볼 수 있듯이 그런 경우는 아닙니다. –

+0

OnPropertyChanged에 대한 코드 : 보호 된 무효 OnPropertyChanged (문자열 이름) { var handler = this.PropertyChanged; if (handler! = null && this.dispatcher! = null) { dispatcher.BeginInvoke (() => {handler (this, new PropertyChangedEventArgs (name));}); } } –