Экземпляр UIElement от XAML - PullRequest
       12

Экземпляр UIElement от XAML

0 голосов
/ 06 ноября 2018

То, чего я пытаюсь достичь, не похоже на ракетостроение. Я пытаюсь создать собственный элемент управления, в который я могу передать список элементов UIElements непосредственно из XAML, чтобы каждый элемент мог отличаться и встраивать разные объекты (сетка / текстовое поле / панель и т. Д.).

Вот код xaml, который я хотел бы использовать:

    <wpf:TileListDoubleItem>
        <wpf:TileListDoubleItem.FrontItem>
            <Grid>
                <TextBlock FontFamily="Calibri,Verdana" FontSize="16" FontWeight="Bold" Foreground="White" Text="Hello"></TextBlock>
            </Grid>
        </wpf:TileListDoubleItem.FrontItem>
        <wpf:TileListDoubleItem.BackItem>
            <Grid>
                <TextBlock FontFamily="Calibri,Verdana" FontSize="16" FontWeight="Bold" Foreground="White" Text="World"></TextBlock>
            </Grid>                                 
        </wpf:TileListDoubleItem.BackItem>
    </wpf:TileListDoubleItem>

А вот мой код управления:

    public partial class TileListDoubleItem : UserControl, INotifyPropertyChanged
    {
        private bool _flipped;
        internal bool CanFlip { get { return true; } }

        private bool flipped
        {
            get {
                return this._flipped;
            }
            set {
                this._flipped = value;
                DisplayItem = this._flipped ? BackItem : FrontItem;
            }
        }

        public ObservableCollection<TileSide> Sides { get; set; }
        public ICommand FlipCommand;

        public TileListDoubleItem()
        {
            InitializeComponent();
            FlipCommand = new FlipCommand(this);
            flipped = false;
        }

        private UIElement displayItem { get; set; }
        public UIElement DisplayItem
        {
            get { return this.displayItem; }
            set {
                if (this.displayItem != value)
                {
                    this.displayItem = value;
                    OnPropertyChanged("DisplayItem");
                }
            }
        }

        public void Flip()
        {
            try
            {
                flipped = !flipped;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public UIElement FrontItem
        {
            get { return (UIElement)GetValue(FrontItemProperty); }
            set { SetValue(FrontItemProperty, value); }
        }

        public static readonly DependencyProperty FrontItemProperty =
        DependencyProperty.Register("FrontItem", typeof(UIElement), typeof(TileListDoubleItem), new UIPropertyMetadata(null));


        public UIElement BackItem
        {
            get { return (UIElement)GetValue(BackItemProperty); }
            set { SetValue(BackItemProperty, value); }
        }

        public static readonly DependencyProperty BackItemProperty =
        DependencyProperty.Register("BackItem", typeof(UIElement), typeof(TileListDoubleItem), new UIPropertyMetadata(null));

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

Когда я запускаю это, мой FrontItem и BackItem равны нулю и никогда не устанавливаются в UIElement (Grid в этом примере). Я думаю, что то, что я пропускаю, должно быть очень очевидным для некоторых людей.

Заранее благодарен за помощь здесь.

1 Ответ

0 голосов
/ 06 ноября 2018

Ваши свойства установлены как ожидалось. Вы можете подтвердить это, например, создав два TextBlocks, которые привязываются к свойствам вашего элемента управления:

<wpf:TileListDoubleItem x:Name="control">
    <wpf:TileListDoubleItem.FrontItem>
        <Grid>
            <TextBlock FontFamily="Calibri,Verdana" FontSize="16" FontWeight="Bold" Foreground="White" Text="Hello"></TextBlock>
        </Grid>
    </wpf:TileListDoubleItem.FrontItem>
    <wpf:TileListDoubleItem.BackItem>
        <Grid>
            <TextBlock FontFamily="Calibri,Verdana" FontSize="16" FontWeight="Bold" Foreground="White" Text="World"></TextBlock>
        </Grid>
    </wpf:TileListDoubleItem.BackItem>
</wpf:TileListDoubleItem>

<TextBlock Text="{Binding FrontItem.Children[0].Text, ElementName=control}" />
<TextBlock Text="{Binding BackItem.Children[0].Text, ElementName=control}" />

Очевидно, что свойства не будут установлены к тому времени, когда возвращается конструктор TileListDoubleItem. Синтаксическому анализатору XAML необходимо создать экземпляр объекта, прежде чем он сможет установить какое-либо из его свойств, так же, как вы делаете это при создании экземпляра класса самостоятельно.

...