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,
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.