2011-01-05 4 views
1

나는 아날로그 시계 제어를 설계했다. 두 개의 타원의 획을 사용하여 바깥 쪽 테두리와 시계 모양의 안쪽 테두리를 나타냅니다.WPF에서 두 데이터 바인딩 된 값의 합계로 바인딩하는 방법?

Clock control

나는 사용자가이 두 가지의 테두리 두께를 변경할 수 있도록 해당 UserControl의 속성을 노출했다. Ellipse.StrokeThickness 속성은 이러한 UserControl 속성에 바인딩됩니다. 경계의 크기가 증가 할 때이 숨겨지지 않도록 순간, 나는 내부 요소의 여백에 바깥 쪽 테두리 두께의 UserControl 속성을 결합하고있다.

<Ellipse Name="OuterBorder" Panel.ZIndex="1" StrokeThickness="{Binding OuterBorderThickness, 
ElementName=This}" Stroke="{StaticResource OuterBorderBrush}" /> 
<Ellipse Name="InnerBorder" Panel.ZIndex="5" StrokeThickness="{Binding InnerBorderThickness, 
ElementName=This}" Margin="{Binding OuterBorderThickness, ElementName=This}" 
Stroke="{StaticResource InnerBorderBrush}"> 
... 
<Ellipse Name="Face" Panel.ZIndex="1" Margin="{Binding OuterBorderThickness, ElementName=This}" 
Fill="{StaticResource FaceBackgroundBrush}" /> 
... 

문제는 내부 경계의 두께가 증가하면,이 부분적으로 가려진 또는 숨겨진 될 수 여백 그래서 시간 눈금과 숫자에 영향을주지 않는다는 것입니다. 그래서 실제로 필요한 것은 내부 컨트롤의 여백 속성을 내부 테두리 두께 값과 외부 테두리 두께 값의 합으로 바인딩 할 수 있다는 것입니다 (두 가지 유형 임).

나는이 성공적으로 사용 '의 DataContext =이;'했던,하지만 난 그것을하지 않는 것이 좋습니다 소리로이없이 제어를 다시 작성하려합니다. 나는 또한 변환기를 사용하고 두 번째 값을 ConverterParameter로 전달하는 것에 대해 생각했지만 ConverterParameter에 바인딩하는 방법을 알지 못했습니다. 모든 팁은 크게 감사하겠습니다.

편집 >> 켄트의 제안에

덕분에, I는 입력 값을 추가하고 결과를 반환하는 간단한 MultiConverter을 만들었습니다. 나는 TextBlock.Text 속성과 TextBlock.Margin 속성 모두를 테스트 할 수있는 컨버터 XAML와 같은 multibinding을 구부려했습니다.

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add"> 
      <Binding Path="OuterBorderThickness" ElementName="This" /> 
      <Binding Path="InnerBorderThickness" ElementName="This" /> 
     </MultiBinding> 
    </TextBlock.Text> 
    <TextBlock.Margin> 
     <MultiBinding Converter="{StaticResource SumConverter}" ConverterParameter="Add"> 
      <Binding Path="OuterBorderThickness" ElementName="This" /> 
      <Binding Path="InnerBorderThickness" ElementName="This" /> 
     </MultiBinding> 
    </TextBlock.Margin> 
</TextBlock> 

나는 TexBlock에 표시되는 정확한 값을 볼 수 있지만 여백이 설정되어 있지 않습니다. 어떤 아이디어?

편집 >> >>

는 흥미롭게도, 여백 속성을 두 번 유형의 데이터 속성에 바인딩 할 수 있지만 이것은 MultiBinding 내에서 적용하지 않는 것 같습니다. 켄트 (Kent)의 조언에 따라, 저는 두께 변환기로 값을 반환하도록 변환기를 변경했으며 이제는 작동합니다. Kent에게 감사드립니다.

답변

3

표현식을 평가할 수있는 변환기가있는 MultiBinding을 찾고있는 것처럼 들립니다. 내 ExpressionConverter 정확히 이것을 허용합니다. 물론 이것을 위해 타사 라이브러리에 대한 의존성을 원하지 않는다면 두 값을 함께 더하는 다중 값 변환기를 작성할 수 있습니다.

+0

나는 입력 값을 추가하고 결과를 반환하는 간단한 MultiConverter을 만들었습니다. TextBlock.Text 속성과 Grid.Margin 속성 모두에 대해 동일한 XBinding을 XAML 변환기와 연결했습니다. TexBlock에서 정확한 값을 볼 수는 있지만 여백은 설정되지 않았습니다. 어떤 아이디어? – Sheridan

+0

'Margin'은 'Thickness' 유형이므로 변환기는 그 인스턴스를 반환해야합니다. Visual Studio에서 출력 창을 확인할 수 있으며 그 결과에 대한 메시지가 나타납니다. –

+0

아, 이상하네요.하지만 맞습니다. 흥미롭게도 Margin 속성은 double 유형의 데이터 속성에 바인딩 될 수 있지만 MultiBinding에는 적용되지 않는 것 같습니다. – Sheridan

0

'DataContext = this;'를 사용하여 성공적으로 수행했지만 권장 사항이 아닌데도이 컨트롤을 다시 작성하려고합니다.

DataContext을 변경하지 않고 사용자 정의 컨트롤의 속성에 바인딩 할 수 있습니다. 단지 루트 요소에 x:Name 속성을 추가 한 다음 {Binding ElementName=Root, Path=MyProperty}을 사용하여 바인딩. 변환기를 사용하여 바인딩에 코드를 삽입하는 것보다 훨씬 간단합니다.

+0

이 방법을 이미 사용하고 있지만 언급 해 주셔서 감사합니다. – Sheridan

+0

(내 루트 요소는 This라고 부름) – Sheridan

+0

루트 요소를 'This'라고 부르는 것이 좋은 아이디어인지 끔찍한 것인지 모르겠습니다. 나는 그것에 대해 좀 더 생각할 필요가 있습니다. –

관련 문제