Привязка из словаря ресурсов XAML к свойству класса - PullRequest
1 голос
/ 16 марта 2012

У меня очень сложное время для настройки привязки, которая, по-моему, должна быть легкой.Помощь очень ценится.

У меня есть словарь ресурсов с именем 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>

У меня есть UserControl с именем FormControl.

public class FormControl : UserControl

Раньше я использовал его как частичный класс с компонентами XAML., в котором сработало то, что я пытаюсь сделать, но мне пришлось удалить XAML, поскольку я наследую этот класс в другой сборке, а WPF не позволяет вам наследовать от частичного класса в другой сборке.

InFormControl Я определяю свойство 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, но независимо от того, что я делаю, полоса прокрутки не собирает значение свойства.

Здесь я создаю свой ScrollViewer в классе FormControl.

        _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 Ответ

2 голосов
/ 16 марта 2012

Используйте привязку RelativeSource вместо ElementName:

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

При этом во время выполнения будет перемещаться визуальное дерево, чтобы найти родительский элемент управления, содержащий ScrollViewer, который решает как ваши задачи, так и проблемы с несколькими экземплярами.

...