2012-03-16 23 views
1

バインドを設定するのは非常に困難ですが、これは簡単だと思います。ヘルプは非常に高く評価されます。XAMLリソースディクショナリからクラスプロパティへのバインド

私はFormResource.xamlという名前のリソース辞書を持っています。この辞書には、テンプレートを再描画するためのScrollView用のスタイルが含まれています。目的は私はそれに広い垂直スクロールバーが欲しいです。

<Style x:Key="LargeScrolling" TargetType="ScrollViewer"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ScrollViewer"> 
       <Grid Background="{TemplateBinding Background}"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <ScrollContentPresenter x:Name="ScrollContentPresenter" 
          Margin="{TemplateBinding Padding}" 
          ContentTemplate="{TemplateBinding ContentTemplate}"/> 
        <ScrollBar x:Name="PART_VerticalScrollBar" 
          Style="{StaticResource LargeVerticalScrollBar}" 
          Width="{Binding ElementName=MDTForm, Path=ScrollBarWidth}" 
          IsTabStop="False" 
          Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
          Grid.Column="1" Grid.Row="0" Orientation="Vertical" 
          ViewportSize="{TemplateBinding ViewportHeight}" 
          Maximum="{TemplateBinding ScrollableHeight}" 
          Minimum="0" 
          Value="{TemplateBinding VerticalOffset}" 
          Margin="0,-1,-1,-1"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

私はFormControlという名前のUserControlを持っています。

public class FormControl : UserControl 

私は、XAMLのcomponenetと部分クラスとしてこれを持っていた私が働いていたんしようとしています何をしたが、私は別のアセンブリで、このクラスから派生し、WPFはないので、私はXAMLを削除する必要がありました他のアセンブリの部分クラスから派生させることはできません。

FormControlでは、私はScrollBarWidthプロパティを定義します。

私は私が私の結合でのElementNameとして使用しています何で私がFormControlクラスにMDTFormの名前を与えた主な宣言に部分クラスとしてこれを持っていた
public static readonly DependencyProperty ScrollBarWidthProperty = DependencyProperty.Register("ScrollBarWidth", typeof(double), typeof(FormControl)); 
    public double ScrollBarWidth 
    { 
     get { return (double)base.GetValue(ScrollBarWidthProperty); } 
     set { base.SetValue(ScrollBarWidthProperty, value); } 
    } 

。私はこの名前をFormClass.csに登録しようとしましたが、スクロールバーが何をしていてもプロパティ値を取得していません。

ここでは、FormControlクラスでScrollViewerを作成します。

 _canvasScrollViewer = new ScrollViewer(); 
     _canvasScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
     _canvasScrollViewer.VerticalAlignment = VerticalAlignment.Top; 
     _canvasScrollViewer.MaxHeight = Constants.ScrollViewMaxHeight; 
     _canvasScrollViewer.Style = (Style)FindResource("LargeScrolling"); 

私がこれを動作させる唯一の方法は、静的プロパティにバインドすることでした。私はこれをバインディングに使用しました。

Width="{Binding Source={x:Static form:FormControl.ScrollBarWidthP}}" 

次にプロパティをそのように定義しました。私は同時にロード複数FormControlオブジェクトを持つことができ、それらは同じスクロールバーの幅プロパティを持っていないすべてのこととして

public static double ScrollBarWidth { get; set; } 

しかし、私はこれを望んでいません。

答えて

2

ではなくのElementNameの結合RelativeSource使用します。

{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
     AncestorType={x:Type controls:FormControl}}, Path=ScrollBarWidth} 

をこれはあなたのスコープと複数インスタンスの問題の両方を解決しScrollViewerのを、含む親コントロールを見つけるために、実行時にビジュアルツリーを歩いていきます。

+0

ありがとう、それは素晴らしいと完璧に動作します。 DependancyPropertyの代わりに自動プロパティをサポートすることは可能でしょうか?片方向バインディングである必要があるだけで、ScrollViewerはFormControlクラスのプロパティを更新しません。今はうまくいきますが、可能であればDependancyPropertyを使用する必要はありません。 – WPFNewbie

+0

バインディングを割り当てる場合(この場合はWidth)、反対側ではなく、DPである必要があります。これはTwoWay Bindingsでも同様です。この場合のScrollBarWidthは、DP、INotifyPropertyChangedを使用するプロパティ(Widthに更新が必要な場合)、または更新が必要ない場合は通常のプロパティのいずれかです。 –

+0

私はそれをpublic doubleで定義されたクラスプロパティに変更しました。ScrollBarWidth {get;セット; }それは動作しません。私はバインディングステートメントを変更することはありませんでしたので、おそらく変更が必要です。 – WPFNewbie

関連する問題