2013-05-02 4 views
0

체크 박스를 통해 변환을 활성화하고 싶습니다.xaml에서 바인딩을 통해 변환을 켜고 끌 수 있습니까?

내 샘플에는 레이블의 텍스트를 x 또는 y 방향으로 각각 바꿔야하는 두 개의 확인란이 있습니다.

코드 없이도 가능합니까? 당신은 Converter 또는 MultiConverter를 사용해야 할 것

<Window x:Class="WpfVideoTest.InversionTestWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="InversionTestWindow" Height="300" Width="300"> 
<DockPanel> 
    <CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertX}">Invert X</CheckBox> 
    <CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertY}">Invert Y</CheckBox> 
    <Label Content="Text to invert" FontSize="40" x:Name="TextToInvert"> 
     <Label.RenderTransform> 
      <TransformGroup> 
       <!-- transformations to swap in x direction --> 
       <ScaleTransform ScaleX="-1" /> 
       <TranslateTransform X="{Binding ActualWidth, ElementName=TextToInvert}" /> 
       <!-- transformations to swap in y direction --> 
       <ScaleTransform ScaleY="-1" /> 
       <TranslateTransform Y="{Binding ActualHeight, ElementName=TextToInvert}" /> 
      </TransformGroup> 
     </Label.RenderTransform> 
    </Label> 
</DockPanel> 

답변

1

:

여기에 지금까지 내 XAML입니다. 예, 코드이지만 WPF의 바인딩에 규칙적인 코드가 추가되었습니다. 개념적으로 변환에 적용된 값을 다른 값에 종속시키고 변환 클래스 자체에 해당 기능이없는 상황이 있습니다.

이것은 변환기의 모습입니다. 첫 번째가 bool 인 경우 세 개의 값이 필요합니다.

public class TernaryConditionalMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values.Length >= 3 && values[0] is bool) 
     { 
      return (bool)values[0] ? values[1] : values[2]; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

이처럼 사용하십시오 :

<ScaleTransform> 
    <ScaleTransform.ScaleX> 
     <MultiBinding Converter="{StaticResource TernaryConditionalConverter}"> 
      <Binding Path="InvertX" /> 
      <Binding Source="{StaticResource PositiveOne}" /> 
      <Binding Source="{StaticResource NegativeOne}" /> 
     </MultiBinding> 
    </ScaleTransform.ScaleX> 
</ScaleTransform> 
PositiveOne 및 NegativeOne 같은 자원 곳으로 정의 된

: 내가 얻을

<sys:Double x:Key="PositiveOne">1</sys:Double> 
+0

"System.Windows.Data 오류 : 5 = BindingExpression에 의해 생성 된 값이 대상 속성에 유효하지 않습니다.; 값 = '1'MultiBindingExpression : 대상 요소가 'ScaleTransform'(HashCode = 43184669)이고 대상 속성이 'ScaleX'(유형 'Double')입니다. . 1.0도 작동하지 않습니다. 그렇다면이 변환기에 두 번째 및 세 번째 바인딩에 대해 올바른 이중 값을 부여하려면 어떻게해야합니까? – MTR

+0

신경 쓰지 마라, 나는 그것을 발견했다. double에 StaticResource를 사용하면 도움이됩니다. 어쨌든 다른 이유로 (바인딩의 부정확 한 업데이트) 나는 InvertX와 InvertY에 따른 완벽한 변환을 제공하는 변환기로 끝났습니다. – MTR

+0

예, 숫자에 대한 정적 리소스를 갖도록 응답을 편집합니다. 그 점을 지적 해 주셔서 감사합니다. – dtm

관련 문제