2012-03-16 3 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> 

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

public class FormControl : UserControl 

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

Здесь я создаю свой 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 загружена в то же время и не все они могут иметь одинаковую ширину полосы прокрутки свойства.

ответ

2

Используйте RelativeSource Binding вместо ElementName:

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

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

+0

Спасибо, это потрясающе и прекрасно работает. Возможно ли, чтобы он поддерживал автоматическое свойство вместо DependancyProperty? Он должен быть единственным способом привязки, ScrollViewer никогда не будет обновлять свойство класса FormControl. Он работает сейчас, и это здорово, но я предпочел бы не использовать DependancyProperty, если это возможно. – WPFNewbie

+0

Он должен быть DP, если вы назначаете привязку к нему (в данном случае Width), но не с другой стороны - это верно и для привязок TwoWay. ScrollBarWidth в этом случае может быть либо DP, либо как свойство, использующее INotifyPropertyChanged (если обновления должны появляться в Width), либо просто любое нормальное свойство, если обновление не требуется. –

+0

Когда я изменил его просто как свойство класса, определенное в public double ScrollBarWidth {get; задавать; } это не работает. Я ничего не изменил, будет заявление Binding, поэтому, возможно, потребуется изменение. – WPFNewbie

Смежные вопросы