Associazione di WPF Griglia Larghezza della Colonna

Sto tentando di associare un DependancyProperty in uno dei miei controlli utente per il Width proprietà di un Column in un Grid.

Ho un codice simile a questo:

<Grid x:Name="MyGridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="TitleSection" Width="100" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>...</Grid.RowDefinitions>

    <GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>

In un separato Usercontrol ho il seguenteDependancyProperty definita.

public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));

public int TitleWidth
{
    get { return (int)base.GetValue(TitleWidthProperty); }
    set { base.SetValue(TitleWidthProperty, value); }
}

Io sono la creazione di istanze di Usercontrol in codice, quindi ho un parere vincolante di simile a questo :

MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */

La prima associazione definito funziona ottimamente, anche se che è vincolante per un effettivo UIElement (in questo caso un dispositivo di Scorrimento), ma l’Associazione “TitleSection” (che è ColumnDefinition definito nella Griglia) non riesce. Mettere un punto di interruzione nel codice e facendo un controllo su “TitleSection” ritorna l’atteso oggetto.

Sto cominciando a sospettare che un x:Name piacerebbe ColumnDefinition non può essere associato. Qualcuno può suggerire come potrei essere in grado di associare la modifica della larghezza della prima colonna nella mia griglia?

EDIT #1 – Per rispondere a commenti

Il databinding ‘fallira’, nel senso che con un set di punto di interruzione sulla setter per il TitleWidth proprietà, e utilizzando il GridSplitter di controllo per ridimensionare la prima colonna, il punto di interruzione non è mai successo. Inoltre, il codice mi sarei aspettato di essere licenziato quando il DependancyProperty TitleWidth modifiche non vengono eseguiti.

Usercontrol che viene aggiunta ad un Stackpanel all’interno della Griglia in Window_Loaded funzione. Mi sarei aspettato che la Griglia è stata emessa dal momento in cui il Usercontrols sono in fase di costruzione. Certamente la x:Name piacerebbe Elemento TitleSection è guardabile e ha un valore di 100 quando vengono costruiti /prima che l’associazione sta accadendo.

EDIT #2 – Forse qualcosa a che fare con questo?

Ho avuto un annusare giro le pagine di MSDN per la Griglia ColumnDefinition documentazione e sono imbattuto in GridLength() ma non riesco a ottenere la mia testa intorno come posso utilizzare questo in un espressione di associazione. Io non uso associato GridLengthConverter come un convertitore per il codice di associazione, in quanto non derivano da IValueConverter.

Sto appoggiato verso in qualche modo vincolante per ActualWidth di proprietà di una delle celle della Griglia oggetto. Non mi sembra pulito come vincolanti per la definizione di colonna, ma al momento non posso ottenere che per funzionare.

  • Non riesce come, e a che punto è la creazione di usercontrol? Ha la griglia è stata visualizzata?
  • Non è possibile fare affidamento su di impostare i punti di interruzione nel set/get di un dependecy proprietà, come non saranno mai utilizzate dal motore di associazione. Internamente depencency proprietà vengono impostate utilizzando SetValue(DependencyProperty, valore)
InformationsquelleAutor Ash | 2008-11-12



3 Replies
  1. 11

    Beh, ho avuto un po ‘ di un kludge di lavoro, spiegherò come per le generazioni future:

    Sostanzialmente ho una colonna 2, multi riga della griglia con uno splitter allineato a destra nella prima colonna in modo da può essere modificata dall’utente se il contenuto contiene richiede più spazio. A complicare le cose ho un controllo utente viene caricato a livello di programmazione in alcune righe, che ha un columnSpan di 2 per il rendering di fini (il contenuto “sanguina” da una cella in avanti).

    Quando la prima colonna è ridimensionata ho bisogno di questo per essere riflessa in usercontrol. In primo luogo ho cercato di associazione per ColumnDefinition ma in realtà non giocare a palla.

    Come ho risolto/Kludged è

    Una di scorta cella della prima colonna ho aggiunto un <Label> con una x:Nome per renderlo accessibile. Come in una cella ha le proprietà di default di ‘Allungare’ e riempie la cella completamente. Esso viene ridimensionata come la colonna è ridimensionato con lo splitter. Associazione per l’Etichetta ActualWidth proprietà significa che la dimensione della colonna sono comunicati al DependancyProperty nel mio columnSpanned usercontrol correttamente.

    Pensieri

    Ovviamente, nonostante ColumnDefinition avere un ActualWidth proprietà, quando cambia non sembra a fuoco il PropertyChanged evento internamente (o è la mia ipotesi migliore). Questo può essere un bug, o per il design, ma per me significa che ho dovuto usare il meno pulito soluzione.

    • Questo ha funzionato bene per me. Ho una leggera torsione: <!– Legare un altro elemento di proprietà Width di questo rettangolo ActualWidth per autosize, per la parte sinistra della colonna larghezza effettiva –> <Rettangolo x:Name=”Column0WidthRect” Width=”100″ della Griglia.Riga=”0″ Della Griglia.Colonna=”0″/>
  2. 3

    Hai provato a impostare l’associazione in xaml, il seguente dovrebbe funzionare per voi.

    <ColumnDefinition 
        x:Name="TitleSection" 
        Width="{Binding 
                    Path=TitleWidth, 
                    RelativeSource={RelativeSource AncestorType=MyUserControl}}" 
        />

    Altrimenti, guardando il codice di associazione sono state fornite, sembra il modo sbagliato per me, l’obiettivo dell’associazione dovrebbe essere la colonna della griglia e la fonte dovrebbe essere la vostra proprietà di dipendenza.

    Il codice equivalente per il sopra xaml è

    BindingOperations.SetBinding(TitleSection, ColumnDefinition.WidthProperty,
        new Binding()
        {
            RelativeSource= new RelativeSource(RelativeSourceMode.FindAncestor, typeof(MyUserControl),1),
            Path = new PropertyPath("TitleWidth"),
        });

    In una nota correlata, utilizzando un GridSplitter e vincolante la Larghezza di proprietà sono mutally esclusivo. Non appena si ridimensiona la colonna utilizzando la linea, il vostro legame sarà sostituito con il valore da splitter.

    Questo è simile a ciò che l’esperienza sarebbe da aggiornare qualsiasi proprietà che è la destinazione di un’associazione. Quando si imposta obiettivi valore direttamente nel codice, si sono essenzialmente la sostituzione di un oggetto binding con il valore di alimentazione.

  3. 2

    ColumnDefinition.La larghezza non è un numero intero, è un GridLength.
    Non è possibile associare il GridLength direttamente al numero Intero, è necessario un convertitore.

    Questo è anche il motivo, perché non è possibile associare qualsiasi Controllo della Larghezza di proprietà (doppio) per un ColumnDefinition proprietà Width (GridLength) senza un convertitore.

Lascia un commento