从XAML资源字典绑定到类属性

时间:2012-03-16 12:35:53

标签: wpf xaml binding resources properties

我很难设置一个我认为应该很容易的绑定。非常感谢帮助。

我有一个名为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组件的部分类,其中我尝试做的工作,但我必须删除XAML,因为我从另一个程序集中的这个类派生而WPF不允许你派生自另一个集合中的部分类。

在FormControl中,我定义了一个ScrollBarWidth属性。

    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); }
    }

当我在主声明中将它作为部分类时,我给FormControl类一个MDTForm的名称,这就是我在绑定中使用的ElementName。我尝试在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}}"

然后定义属性。

public static double ScrollBarWidth { get; set; }

但是,我不想这样,因为我可以同时加载多个FormControl对象,并且它们可能并非都具有相同的滚动条宽度属性。

1 个答案:

答案 0 :(得分:2)

使用RelativeSource Binding而不是ElementName:

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

这将在运行时向上查看可视树,以查找包含ScrollViewer的父控件,它可以解决您的范围和多个实例问题。