0

私は、同じコントロールを持つコントロールを作成しようとしているというこの問題を抱えています。

私の制御コードはここにあります:

<UserControl x:Class="SubEventsControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:currentControl="clr-namespace:MyNamespace"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             d:DesignHeight="300"
             d:DesignWidth="400"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             mc:Ignorable="d">

    <Grid x:Name="LayoutRoot" >
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <ItemsControl x:Name="SubEventsItemsControl"
                      Grid.Row="0"
                      Margin="5,0,5,5"
                      ItemsSource="{Binding ControlSubEvents}"
                      ScrollViewer.VerticalScrollBarVisibility="Auto">
            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <ItemsPresenter />
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <!--  Header  -->
                        <Grid Grid.Row="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <!--  Sub event text  -->
                            <TextBlock Grid.Column="0"
                                       Margin="3"
                                       HorizontalAlignment="Left"
                                       VerticalAlignment="Center"
                                       Style="{StaticResource DynamicTextBlockStyle}"
                                       Text="{Binding Path=SubEventName}"
                                       TextWrapping="Wrap" />


                            <Border Grid.Column="1"
                                    Width="10"
                                    Height="10"
                                    HorizontalAlignment="Right"
                                    Background="{Binding RegistrationStatusId,
                                                         Converter={StaticResource BackgroundConverter}}"
                                    CornerRadius="5"
                                    ToolTipService.ToolTip="{Binding RegistrationStatusLabel}" />
                        </Grid>

                        <!--  Subevent's subevents  -->
                        <currentControl:SubEventsControl Grid.Row="1" ControlSubEvents="{Binding Path=SubEvents}" />

                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

そして、この背後にあるクラスは次のようになります。

namespace MyNamespace
{
    public partial class SubEventsControl : UserControl, INotifyPropertyChanged
    {

        private PortalDomainContext _portalDomainContext;
        private EntityCollection<SubEvent> _controlSubEvents;

        public SubEventsControl()
        {
            InitializeComponent();
        }



        public event PropertyChangedEventHandler PropertyChanged;

        public PortalDomainContext PortalDomainContext
        {
            get
            {
                return _portalDomainContext;
            }

            set
            {
                if (_portalDomainContext != value)
                {
                    _portalDomainContext = value;
                    this.NotifyChange("PortalDomainContext");
                }
            }
        }

        public EntityCollection<SubEvent> ControlSubEvents
        {
            get { return _controlSubEvents; }
            set
            {
                if (_controlSubEvents != value)
                {
                    _controlSubEvents = value;
                    NotifyChange("ControlSubEvents");
                }
            }
        }


        // Dependency properties declaration
        public static readonly DependencyProperty SubEventsProperty = DependencyProperty.Register(
            "ControlSubEvents",
            typeof(EntityCollection<SubEvent>),
            typeof(SubEventsControl),
            new PropertyMetadata(null, OnTestEventsChanged));

        private static void OnTestEventsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {   
        }


        protected void NotifyChange(params string[] properties)
        {
            if (PropertyChanged != null)
            {
                foreach (string property in properties)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(property));
                }
            }
        }
    }
}

別のコントロールで使用すると、最初のレベルは取得できますが、2 番目のレベルは取得できません。何が間違っていますか? 拘束力のある問題がいくつかありませんか? 私は可能だと思いますが、多分私は間違っていますか?

4

1 に答える 1

1

無限再帰が発生するため、コントロールのインスタンス自体を宣言的にネストすることはできません。

コードを使用して、コントロールのインスタンスを子要素と同じコントロールのインスタンスに追加することをお勧めします。

于 2012-05-25T15:31:17.323 に答える