我很难设置一个我认为应该很容易的绑定。非常感谢帮助。
我有一个名为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对象,并且它们可能并非都具有相同的滚动条宽度属性。
答案 0 :(得分:2)
使用RelativeSource Binding而不是ElementName:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type controls:FormControl}}, Path=ScrollBarWidth}
这将在运行时向上查看可视树,以查找包含ScrollViewer的父控件,它可以解决您的范围和多个实例问题。