Laden...

UniformGrid, ItemsControl und Rows/Columns?

Erstellt von EgoFelix vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.999 Views
E
EgoFelix Themenstarter:in
38 Beiträge seit 2009
vor 14 Jahren
UniformGrid, ItemsControl und Rows/Columns?

Guten Abend liebe Community!

Ich habe ein Problem mit einem ControlTemplate. Ich habe eine Klasse erstellt (Calendar) welche 3 DependencyProperties besitzt. Rows (int), Columns (int) sowie DayItems. Ich möchte nun die DayItems in einem UniformGrid anzeigen, welches jeweils soviele Spalten/Zeilen hat, wie in der Klasse angegeben. Mein Template sieht soweit nun so aus:


        <Style TargetType="{x:Type fw:Calendar}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type fw:Calendar}">
                        <ItemsControl ItemsSource="{TemplateBinding DayItems}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <UniformGrid Rows="3" Columns="1"></UniformGrid>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Nur wie kann ich nun aus dem ItemsPanelTemplate auf die eigentliche Klasse Calendar zugreifen? Habe schon alles versucht und weiss leider nicht mehr weiter. Ein RelativeSource funktioniert leider nicht, das ItemsPanel scheint keinen Parent gesetzt zu bekommen...

Hat Jemand eine Idee? 😃

Vielen Dank

Mit freundlichen Grüßen
Felix

E
EgoFelix Themenstarter:in
38 Beiträge seit 2009
vor 14 Jahren

Habe es jetzt anders geloest. Habe einfach eine neue Klasse erstellt Namens UniformItemsControl.


    public class UniformItemsControl : ItemsControl
    {
        #region Columns
        public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(int), typeof(UniformItemsControl), new PropertyMetadata(new PropertyChangedCallback(ColumnsChanged)));

        public int Columns
        {
            get { return (int)GetValue(ColumnsProperty); }
            set { SetValue(ColumnsProperty, value); }
        }

        private static void ColumnsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            // update the itemspanel
            UniformItemsControl uic = ((UniformItemsControl)sender);
            uic.RefreshItemsPanel(uic.Rows, (int)e.NewValue);
        }
        #endregion

        #region Rows
        public static readonly DependencyProperty RowsProperty = DependencyProperty.Register("Rows", typeof(int), typeof(UniformItemsControl), new PropertyMetadata(new PropertyChangedCallback(RowsChanged)));

        public int Rows
        {
            get { return (int)GetValue(RowsProperty); }
            set { SetValue(RowsProperty, value); }
        }

        private static void RowsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            // update the itemspanel
            UniformItemsControl uic = ((UniformItemsControl)sender);
            uic.RefreshItemsPanel((int)e.NewValue, uic.Columns);
        }
        #endregion

        /// <summary>
        /// update the itemspanel to the current configuration
        /// </summary>
        /// <param name="Rows"></param>
        /// <param name="Columns"></param>
        private void RefreshItemsPanel(int Rows, int Columns)
        {
            // make a new uniformgrid, as the old will be sealed properly
            FrameworkElementFactory fef = new FrameworkElementFactory(typeof(UniformGrid));

            // set values
            fef.SetValue(UniformGrid.RowsProperty, Rows);
            fef.SetValue(UniformGrid.ColumnsProperty, Columns);
            
            // create the template
            ItemsPanelTemplate ipt = new ItemsPanelTemplate();
            ipt.VisualTree = fef;

            // set the template
            this.ItemsPanel = ipt;
        }

        /// <summary>
        /// constructor
        /// </summary>
        public UniformItemsControl()
            : base()
        {
            this.RefreshItemsPanel(this.Rows, this.Columns);
        }
    }

Nutzen kann man diese sehr simpel!


<fw:UniformItemsControl Rows="{TemplateBinding Rows}" Columns="{TemplateBinding Columns}" ItemsSource="{TemplateBinding DayItems}" />

Damit klappts 😃

Noch zur Info: Das ganze wird fuer einen Kalender verwendet. Die Ansicht soll man schnell zwischen Woche und Monat wechseln koennen. Also einfach die Rows z.B. anpassen.

Mit freundlichen Grüßen
Felix