2017-12-13 16 views
0

ItemsControlItemsSource이 있고 Paths가 ObservableCollection입니다. 우리가 우리의 ViewModel에서멀티 바인드가 작동하지 않음 - 경로의 스트로크 두께가 변하지 않았습니다.

private double _strokeThickness; 
public double StrokeThickness 
{ 
    get { return _strokeThickness; } 
    set 
    { 
     _strokeThickness = value; 
     OnPropertyChanged(nameof(StrokeThickness)); 
    } 
} 

:

public ObservableCollection<Path> PathCollection 
{ 
    get { return _pathCollection; } 
    set 
    { 
     _pathCollection = value; 
     OnPropertyChanged(nameof(PathCollection)); 
    } 
} 

그리고 이것은 내보기입니다 : 나는 Multibinding 사용하고

<!-- Paths --> 
<ItemsControl ItemsSource="{Binding PathCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Path Stroke="{Binding Stroke}" 
        Data="{Binding Data}"> 
       <Path.StrokeThickness> 
        <MultiBinding Converter="{StaticResource  
         CorrectStrockThiknessConvertor}"> 
         <MultiBinding.Bindings> 
          <Binding Source="{Binding 
           StrokeThickness}"></Binding> 
          <Binding ElementName="RootLayout" 
           Path="DataContext.ZoomRatio" > 
          </Binding> 
         </MultiBinding.Bindings> 
        </MultiBinding> 
       </Path.StrokeThickness> 
      </Path> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas x:Name="Canvas"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

INotifyPropertyChanged을 구현하는 경로 클래스는 StrokeThickness라는 이름의 속성이 ZoomRatio에 기반한 StrokeThickness. ZoomRatio는지도가 확대 될 때마다 계산됩니다.

이 내 MultiBinding 변환기입니다 :

public class CorrectStrockThiknessConvertor : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values != null & values.Length == 2 && (double)values[0] != 0) 
     { 
      return (double)values[1]/(double)values[0]; 
     } 
     return 1; 
    } 

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

나는이 변환기에게 그 작업 벌금을 추적하지만 StrokeThikness가 동일하고 반환 값은 경로의 StrokeThikness을 변경하지 않습니다 의미 매번 그것을 입력 데이터를 때.

내가 잘못하고있는 것이 있습니까?

+0

'Binding.Source'는 바인딩에 의해 감시 될 객체의 * instance *를 지정합니다. 'Binding.Path'를 지정하지 않으면 그것은 * double *의 인스턴스를 직접 모니터하고 (관찰 가능한 콜렉션에 의해'Path' 인스턴스를 유지하지 않습니다) 이것이 문제입니다. – Sinatr

+1

@Sinatr 그리고 소스에 바인딩이 있습니다. 'XamlParseException이 발생합니다. – Clemens

답변

1

멀티 바인딩의 첫 번째 바인딩이 잘못되었습니다. 그것은 다음과 같이한다 : 속성 이름이 정확한지 여부를 지속적으로 귀하의 질문에 StrokeThikness 대신 StrokeThickness 쓰기로

<MultiBinding.Bindings> 
    <Binding Path="StrokeThickness" /> 
    <Binding ElementName="RootLayout" Path="DataContext.ZoomRatio" /> 
</MultiBinding.Bindings> 

또한, 확인.

변환기 코드도 확인해야합니다. 당신이 ZoomRatioStrokeThickness으로 나누고있는 것 같습니다. 이것은 제 이해가 다른 방향 일 것입니다.

+0

코드를 다시 검사했습니다. 코드에 'StrokeThikness'가 없습니다. 그것은 내 질문에 텍스트의 철자가 잘못되었습니다. 내가 말한대로 Xaml 코드가 변경되었지만 다시는 작동하지 않습니다. ZoomRatio의 수식에 관계없이 반환 값은 패스의 스트로크 속도에 영향을주지 않습니다. –

+0

변환기를 디버그하여 원하는 값이 반환되는지 확인하십시오. 또한 Visual Studio의 출력 창에서 바인딩 오류 메시지를 확인하십시오. – Clemens