У меня очень сложное время, создавая привязку, которая, по моему мнению, должна быть простой. Помощь очень ценится.Связывание из ресурсного словаря 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 загружена в то же время и не все они могут иметь одинаковую ширину полосы прокрутки свойства.
Спасибо, это потрясающе и прекрасно работает. Возможно ли, чтобы он поддерживал автоматическое свойство вместо DependancyProperty? Он должен быть единственным способом привязки, ScrollViewer никогда не будет обновлять свойство класса FormControl. Он работает сейчас, и это здорово, но я предпочел бы не использовать DependancyProperty, если это возможно. – WPFNewbie
Он должен быть DP, если вы назначаете привязку к нему (в данном случае Width), но не с другой стороны - это верно и для привязок TwoWay. ScrollBarWidth в этом случае может быть либо DP, либо как свойство, использующее INotifyPropertyChanged (если обновления должны появляться в Width), либо просто любое нормальное свойство, если обновление не требуется. –
Когда я изменил его просто как свойство класса, определенное в public double ScrollBarWidth {get; задавать; } это не работает. Я ничего не изменил, будет заявление Binding, поэтому, возможно, потребуется изменение. – WPFNewbie