Domanda

Sto tentando di associare a DependancyProperty in uno dei miei controlli utente al Width proprietà di a 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 Usercontrol separato ho quanto segueDependancyProperty definito.

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); }
}

Sto creando istanze di Usercontrol nel codice, quindi ho un'istruzione vincolante simile a questa:

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 definita funziona in modo fantastico, sebbene sia associata a un UIElement effettivo (in questo caso uno Slider), ma l'associazione a "TitleSection" (che è la ColumnDefinition definita nella griglia) fallisce.Inserendo un punto di interruzione nel codice ed eseguendo un controllo su "TitleSection" si restituisce l'oggetto previsto.

Comincio a sospettare che non sia possibile associare una x:Name'd ColumnDefinition. Qualcuno può suggerire come potrei essere in grado di associarmi alla larghezza variabile della prima colonna nella mia griglia?

EDIT # 1 - Per rispondere ai commenti

L'associazione dati "fallisce" nel senso che con un punto di interruzione impostato sul setter per il file TitleWidth proprietà e utilizzando il controllo GridSplitter per ridimensionare la prima colonna, il punto di interruzione non viene mai raggiunto.Inoltre, il codice che mi aspetterei venga attivato quando DependancyProperty TitleWidth le modifiche non vengono eseguite.

Il controllo utente viene creato e aggiunto a un pannello Stack all'interno della griglia in Window_Loaded funzione.Mi aspetterei che la griglia sia stata renderizzata nel momento in cui vengono costruiti i controlli utente.Certamente l'x:Name'd Element TitleSection è guardabile e ha un valore di 100 quando vengono costruiti/prima che avvenga la rilegatura.

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

Ho dato un'occhiata alle pagine MSDN per la documentazione di Grid ColumnDefinition e mi sono imbattuto Lunghezza griglia() ma non riesco a capire come posso usarlo in un'espressione vincolante.Non posso utilizzare il GridLengthConverter associato come convertitore nel codice di associazione poiché non deriva da IValueConverter.

Sono propenso a legarsi in qualche modo alla proprietà ActualWidth di una delle celle nell'oggetto Grid.Non sembra così pulito come legarsi alla definizione della colonna, ma al momento non riesco a farlo funzionare.

È stato utile?

Soluzione

Beh, ho un po 'di lavoro, spiegherò come per le generazioni future:

Essenzialmente ho una griglia a 2 colonne, multi fila con uno splitter allineato a destra nella prima colonna in modo che possa essere ridimensionato dall'utente se il contenuto che contiene richiede più spazio. Per complicare le cose, ho un controllo utente che viene caricato in modo programmatico in alcune delle righe che ha una colonnaSpan di 2 a scopo di rendering (il contenuto "sanguina" da una cella alla successiva).

Quando la prima colonna viene ridimensionata, ho bisogno che questo si rifletta nel controllo utente. In primo luogo ho provato a legare a ColumnDefinition ma in realtà non stava giocando a palla.

Come l'ho corretto / Kludged

In una cella di riserva nella prima colonna ho aggiunto un <Label> con un nome x: per renderlo accessibile. Come è in una cella, ha le proprietà predefinite di "Allunga" e riempie completamente la cella. Viene ridimensionato quando la colonna viene ridimensionata utilizzando lo splitter. Associare alla proprietà ActualWidth dell'etichetta significa che le modifiche alle dimensioni della colonna vengono comunicate alla proprietà Dependancy nella mia colonna Controllo utente correttamente utilizzato.

Pensieri

Ovviamente, nonostante ColumnDefinition abbia una proprietà PropertyChanged quando cambia, non sembra generare l'evento <=> internamente (o questa è la mia ipotesi). Potrebbe trattarsi di un bug o di progettazione, ma per me significa che ho dovuto usare una soluzione meno pulita.

Altri suggerimenti

Hai provato a configurare l'associazione in xaml, quanto segue dovrebbe funzionare per te.

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

Altrimenti, guardando il codice di associazione che hai fornito, mi sembra sbagliato, la destinazione dell'associazione dovrebbe essere la colonna della griglia e l'origine dovrebbe essere la proprietà di dipendenza.

Il codice equivalente per xaml sopra è

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

In una nota correlata, l'utilizzo di un GridSplitter e l'associazione della proprietà Larghezza si escludono a vicenda.Non appena ridimensioni la colonna utilizzando lo splitter, l'associazione verrà sostituita con il valore dello splitter.

Ciò è simile a ciò che si verificherebbe aggiornando qualsiasi proprietà che sia la destinazione di un'associazione.Quando imposti il ​​valore di destinazione direttamente nel codice, stai essenzialmente sostituendo l'oggetto di associazione con il valore fornito.

ColumnDefinition.Width non è un numero intero, è una GridLength. Non è possibile associare GridLength direttamente all'intero, è necessario un convertitore.

Questo è anche il motivo per cui non è possibile associare alcuna proprietà Width di Control (double) a una proprietà Width di ColumnDefinition (GridLength) senza un convertitore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top