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

Wpf 从XAML资源字典绑定到类属性,wpf,xaml,binding,resources,properties,Wpf,Xaml,Binding,Resources,Properties,我正在经历一个非常困难的时期,建立一个我认为应该很容易的装订。非常感谢您的帮助 我有一个名为FormResource.xaml的资源字典。在这个字典中包含了一个我重新定义模板的ScrollView样式。目的是我想要一个更宽的垂直滚动条 <Style x:Key="LargeScrolling" TargetType="ScrollViewer"> <Setter Property="Template"> <Setter.Value>

我正在经历一个非常困难的时期,建立一个我认为应该很容易的装订。非常感谢您的帮助

我有一个名为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>
我曾经将它作为一个带有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对象,而且它们可能不都具有相同的滚动条宽度属性。

使用相对资源绑定而不是ElementName:

    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); }
    }
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
         AncestorType={x:Type controls:FormControl}}, Path=ScrollBarWidth}

这将在运行时沿着可视化树查找包含ScrollViewer的父控件,它解决了您的作用域问题和多实例问题。

谢谢,这太棒了,效果非常好。是否可以让它支持自动属性而不是DependencyProperty?它只需要是单向绑定,ScrollViewer永远不会更新FormControl类的属性。它现在可以工作了,这很好,但是如果可能的话,我更希望不必使用DependencyProperty。如果要为它指定绑定(在本例中为宽度),它只需要是DP,但不需要在另一侧-对于双向绑定也是如此。在本例中,ScrollBarWidth可以是DP、使用INotifyPropertyChanged的属性(如果需要在Width上显示对它的更新),也可以是任何普通属性(如果不需要更新)。当我将它更改为仅在public double ScrollBarWidth{get;set;}上定义的类属性时,它不起作用。我没有对绑定语句进行任何更改,因此可能需要进行更改。