2017-12-13 21 views
0

ItemsControlにはItemsSourceがあり、パスは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)); 
    } 
} 

そして、これが私のビューである:私は多使用している

<!-- 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を実装Pathクラスは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'は、バインディングによって監視されるオブジェクトの*インスタンス*を指定します。 'Binding.Path'を指定せずに、* double *のインスタンスを直接監視します(監視可能なコレクションによって保持された' Path'インスタンスではない)。これが問題です。 – Sinatr

+1

@Sinatrそして、ソースにバインドされている、 ''はXamlParseExceptionになります。 – Clemens

答えて

1

マルチバインディングの最初のバインドが間違っています。それは次のようになります。あなたは常にあなたの質問に代わりStrokeThicknessStrokeThiknessを書いて、プロパティ名が、正しいかどう

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

も確認してください。

また、コンバータコードを確認する必要があります。あなたはZoomRatioStrokeThicknessで分けているようですが、それは私の理解には反対の方向です。

+0

私のコードをもう一度チェックしました。私のコードには 'StrokeThikness'はありません。それは私の質問のテキストのスペルミスです。私はあなたが言ったようにXamlコードを変更しましたが、再び動作しません。 ZoomRatioの式に関係なく、戻り値はパスのストロークメッキには影響しません。 –

+0

コンバータをデバッグして、目的の値が返されるかどうかを確認します。 Visual Studioの出力ウィンドウでバインドエラーメッセージも確認します。 – Clemens

関連する問題