Silverlight: привязка к свойствам зависимостей UserControl - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть пользовательский элемент управления с именем GraphPanel. Он имеет два свойства зависимостей: одно пользовательское, PanelTitle, а другое унаследовано от FrameworkElement, Content.

    public static readonly DependencyProperty PanelTitleProperty = DependencyProperty.Register(
        "PanelTitle",
        typeof(string),
        typeof(GraphPanel),
        new PropertyMetadata("")
    );
    // ...
    public string PanelTitle
    {
        set { SetValue(PanelTitleProperty, value); } 
        get { return (string)GetValue(PanelTitleProperty); }
    }

Код XAML выглядит следующим образом:

<UserControl 
    x:Class="PlaceringsGuiden.Library.Components.GraphPanel"
    DataContext="{Binding RelativeSource={RelativeSource self}}">

    <UserControl.Resources>
        <ResourceDictionary Source="/App;component/Assets/Styles/GraphPanelStyles.xaml" />
    </UserControl.Resources>

    <Border Style="{StaticResource GraphPanelBorderStyle}">
        <Grid Style="{StaticResource GraphPanelGridStyle}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="1*" />
                <RowDefinition Height="8*" />
            </Grid.RowDefinitions>
            <Grid Grid.Column="0" Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.02*" />
                    <ColumnDefinition Width="1*" />
                    <ColumnDefinition Width="0.02*" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="1" 
                           Grid.Row="0" 
                           Text="{Binding Path=PanelTitle}" 
                           Style="{StaticResource GraphPanelHeaderStyle}" />
            </Grid>

            <Grid Grid.Column="0" Grid.Row="0" x:Name="GraphPanelContentPresenter">
                <ContentPresenter Content="{Binding Path=Content}" />
            </Grid>
        </Grid>
    </Border>
</UserControl>

Выполнение этого приводит к исключению:

Value does not fall within the expected range.
   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)

Что я делаю не так? Что я должен сделать для достижения этой привязки?

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2011

Я решил эту проблему, удалив привязку из ContentPresenter.Тем не менее, это решение имеет недостатки, поскольку пользовательский элемент управления не является контейнером элементов.

Благодаря созданию нового класса, расширяющего ContentControl, стилизация с помощью ControlTemplate, это достигается без необходимости сложных сценариев связывания.

public class GraphPanel : ContentControl
{
    #region Properties
    public string PanelTitle
    {
        get { return (string) GetValue(PanelTitleProperty); }
        set { SetValue(PanelTitleProperty, value); }
    }
    #endregion

    #region Dependency properties
    public static readonly DependencyProperty PanelTitleProperty = 
        DependencyProperty.Register("PanelTitle", typeof(string), typeof(GraphPanel), new PropertyMetadata(""));
    #endregion

    public GraphPanel() 
        : base()
    {
        DefaultStyleKey = typeof(GraphPanel);
    }
}

и код XAML:

<Style TargetType="local:GraphPanel">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:GraphPanel">
                <Border Style="{StaticResource GraphPanelBorderStyle}">
                    <Grid Style="{StaticResource GraphPanelGridStyle}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="8*" />
                        </Grid.RowDefinitions>
                        <Grid Grid.Column="0" Grid.Row="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="0.02*" />
                                <ColumnDefinition Width="1*" />
                                <ColumnDefinition Width="0.02*" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="1" 
                       Grid.Row="0" 
                       Text="{TemplateBinding PanelTitle}" 
                       Style="{StaticResource GraphPanelHeaderStyle}" />
                        </Grid>

                        <Grid Grid.Column="0" Grid.Row="1">
                            <ContentPresenter />
                        </Grid>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Иногда это просто помогает записать это, и вы поймете свои собственные ошибки.Спасибо, что подумали об этом!

...