Frage

Ich versuche, eine DependancyProperty in einem mein Benutzersteuerelement auf die Width Eigenschaft eines Column in einem Grid zu binden.

Ich habe Code ähnlich wie diese:

<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 einem separaten Usercontrol Ich habe die followingDependancyProperty definiert.

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

Ich bin Instanzen der Usercontrol in Code erstellen, damit ich eine verbindliche Aussage ähnlich wie diese:

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 */

Die erste Bindung definiert Werke phantastisch, aber das ist auf eine tatsächliche UIElement ist bindend (in diesem Fall einen Slider), aber die Bindung an „Titlesection“ (das ist die Column im Grid definiert ist) ausfällt. einen Haltepunkt im Code setzen und eine Uhr auf „Titlesection“ gibt das erwartete Objekt zu tun.

Ich fange an, dass ein x Verdacht Name'd Column kann nicht gebunden werden. Kann jemand empfehlen, wie ich auf die sich verändernde Breite der ersten Spalte in meinem Netz zu binden könnten fähig sein?

EDIT # 1 - Zur Beantwortung Kommentare

Die Datenbindung ‚versagt‘ in dem Sinne, dass mit einem Haltepunkt auf den Setter für die TitleWidth Eigenschaft festgelegt und mit der Gridsplitter Steuerung in der erste Spalte, um die Größe, wird der Breakpoint nie getroffen. Zusätzlich Code würde ich erwarten, die entlassen werden, wenn die DependancyProperty TitleWidth Änderungen nicht ausgeführt bekommen.

Die Usercontrol wird erstellt und zu einer Stackpanel im Grid in der Window_Loaded Funktion. Ich würde erwarten, dass das Gitter durch die Zeit gemacht wurde, die Benutzersteuerelemente gebaut werden. Gewiß ist die x. Name'd Element TitleSection ist ansehnlich und hat einen Wert von 100, wenn sie gebaut werden / vor der Bindung geschieht

EDIT # 2 -? Vielleicht etwas damit zu tun,

Ich habe für das Grid Column Dokumentation schnuppern um die MSDN-Seiten wurden mit und sind dabei auf

War es hilfreich?

Lösung

Nun, ich habe ein bisschen ein kludge Arbeits bekam, werde ich erklären, wie für künftige Generationen:

Im Wesentlichen habe ich einen 2-Säule, mehrreihige Raster mit einem Splitter rechts in der ersten Spalte ausgerichtet, so kann sie durch den Benutzer geändert werden, wenn der Inhalt enthält es mehr Platz benötigt. Erschwerend Dinge, die ich ein Benutzersteuer haben wird programmatisch in einige der Zeilen geladen, die eine Column von 2 zum Rendern Zwecke (content ‚blutet‘ von einer Zelle in die nächste) hat.

Wenn die erste Spalte der Größe verändert wird muss ich dies in der Usercontrol widerspiegeln. Zum einen habe ich versucht, auf die Column Bindung, aber es war wirklich nicht Ball spielen.

Wie ich fest / kludged es

In einer Ersatzzelle in der ersten Spalte habe ich eine <Label> mit einem x: Name zugänglich zu machen. Wie es in einer Zelle ist, hat es Standardeigenschaften von ‚Stretch‘ und füllt die Zelle vollständig. Es verkleinert wird, wie die Spalte angepasst wird, um den Splitter verwenden. Die Bindung an das ActualWidth Eigenschaft Label bedeutet, dass Änderungen an die Größe der Spalte zu dem DependancyProperty in meinem columnSpanned kommuniziert werden Usercontrol richtig.

Gedanken

Offensichtlich trotz Column eine ActualWidth Eigenschaft hat, wenn sie sich ändert es nicht intern scheint das PropertyChanged Ereignis ausgelöst (oder das ist meine beste Vermutung). Dies kann ein Problem sein, oder durch Design, aber für mich bedeutet, ich habe eine weniger saubere Lösung verwenden muß.

Andere Tipps

Haben Sie versucht, die Bindung in XAML einrichten, sollte die folgende für Sie arbeiten.

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

Ansonsten bei der Bindung Code suchen Sie geliefert haben, ist es der falsche Weg scheint mir herum, sollte das Ziel der Bindung kann die Rasterspalte und die Quelle sollte Ihre Abhängigkeitseigenschaft sein.

Der entsprechende Code für die oben XAML ist

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

über einen entsprechenden Hinweis, einen Gridsplitter verwenden und die Width-Eigenschaft verbindlich ist mutally exklusiv. Sobald Sie die Spalte mit dem Splitter Größe ändern, Ihre Bindung wird mit dem Wert aus dem Splitter ersetzt.

Dies ist ähnlich zu dem, was Sie durch die Aktualisierung jede Eigenschaft erfahren würden, dass das Ziel einer Bindung ist. Wenn Sie den Zielwert direkt im Code festgelegt, werden Sie esentially die Bindung Objekt mit dem Wert ersetzen Sie liefern.

ColumnDefinition.Width keine ganze Zahl ist - es ist ein GridLength ist. Sie können nicht die GridLength direkt an die Integer binden, benötigen Sie einen Konverter.

Dies ist auch der Grund, warum Sie keine Kontrolle der Width-Eigenschaft (double) zu einem Column der Width-Eigenschaft (GridLength) ohne Konverter binden kann.

scroll top