2008-11-12 32 views
7

'u özelliğini Column özelliğine Grid numaralı telefona bağlamayı deniyorum.WPF Grid Sütun Genişliğine Bağlama

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

tanımlanan DependancyProperty aşağıdaki Ben ayrı Usercontrol olarak:

Buna benzer kodu vardır. ki (gerçek UIElement bağlanma olmasına rağmen, fevkalade

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

ilk bağlayıcı tanımlanan eserleri:

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

Ben dolayısıyla ben buna benzer bir bağlama deyimi var, kodda Usercontrol örneklerini oluşturma bu durumda bir Slider), ancak "TitleSection" ile Bağlama (Kılavuzda tanımlanan ColumnDefinition) başarısız olur. Kodda bir kesme noktası koymak ve "TitleSection" üzerinde bir saat yapmak, beklenen nesneyi döndürür.

x: Name'd ColumnDefinition'ın bağlanamayacağından şüphelenmeye başladım. Şebekemdeki ilk sütunun değişen genişliğine nasıl bağlanabileceğimi öneren var mı?

DÜZENLEME # 1 - yorum

veri bağlama anlamında 'başarısız' cevaplamak için bir TitleWidth özellik için setter ayarlanmış kesme ve ilk sütunu yeniden boyutlandırmak için GridSplitter kontrolünü kullanarak, kesme noktası asla vurulmaz. Ek olarak, DependancyProperty TitleWidth değişiklikleri gerçekleştirilmediğinde kodun işlenmesini beklerim.

Usercontrol oluşturuluyor ve Window_Loaded işlevindeki Kılavuz içindeki bir Stackpanel'e ekleniyor. Grid'in, Usercontrols oluşturulduğu zamana kadar oluşturulduğunu beklerim. Tabii ki x: Name'd Elementi TitleSection, bağlanabiliyorsa ve/veya bağlantı kurulmadan önce 100 değerine sahiptir.

EDIT # 2 - Muhtemelen bununla ilgili bir şey var mı?

ben Izgara ColumnDefinition dokümantasyon için MSDN sayfalarında yuvarlak bir kokla sahip oldum ve GridLength() rastlamak ama ben bir bağlayıcı ifadede kullanabilirsiniz etrafında başımı alamıyorum. İlişkili GridLengthConverter'i, IValueConverter'den kaynaklanmadığı için bağlayıcı kodda bir dönüştürücü olarak kullanamıyorum.

Bir şekilde Grid nesnesindeki hücrelerden birinin ActualWidth özelliğine bağlanma eğilimindeyim. Sütun tanımına bağlandığı kadar temiz görünmüyor, ama şu anda işe yaramayacağım.

+0

Kullanıcı denetimini nasıl ve hangi noktada oluşturuyorsunuz? Kılavuz görüntülendi mi? – Donnelle

+0

Bağlantı noktaları tarafından asla kullanılmayacağından, bağımlılık özelliklerinin kümesinde/noktalarında kesme noktaları ayarlamaya güvenemezsiniz. Dahili bağımlılık özelliği, SetValue (DependencyProperty, value) –

cevap

9

Eh ben kludge çalışma biraz var, nasıl gelecek kuşaklar için açıklayacağız: Esasen

bekleyebilir böylece ilk sütunda hizalanmış bir ayırıcı sağ ile 2 sütun, çok sıralı ızgara var içerdiği içerik daha fazla alan gerektiriyorsa kullanıcı tarafından yeniden boyutlandırılmalıdır. Bir şeyleri karmaşıklaştırmak için, bir kullanıcı denetiminin programlı olarak yüklenmesi için iki satırlık bir sütun (bir hücrenin bir sonraki hücrelere sızması) içeriyor.

İlk sütun yeniden boyutlandırıldığında, usercontrol'e yansıtılmak için buna ihtiyacım var. Öncelikle ColumnDefinition'a bağlanmayı denedim ama gerçekten top çalmıyordu. İlk sütunda bir yedek hücrede/kludged o

sabit Nasıl

Bir x ile bir <Label> eklendi: Adı erişilebilir hale getirmektir. Bir hücrede olduğu gibi, 'Stretch' varsayılan özelliklerine sahiptir ve hücreyi tamamen doldurur. Sütun splitter kullanılarak yeniden boyutlandırıldığı için yeniden boyutlandırılır. Label'in ActualWidth özelliğine bağlanması, sütunun boyutundaki değişikliklerin sütununSpanned usercontrol öğesindeki DependancyProperty öğesine doğru şekilde iletildiği anlamına gelir.

Düşünceler Açıkçası

, ColumnDefinition o içten PropertyChanged olayı görünmüyor değiştirdiğinde ActualWidth özelliğine sahip (ya da benim en iyi tahminde şu) rağmen. Bu bir hata ya da tasarım gereği olabilir, ama benim için daha az temiz bir çözüm kullanmak zorunda olduğum anlamına geliyor.

+1

kullanılarak ayarlanır. Bu benim için iyi çalıştı. Hafif bir bükümüm var: Foredecker

3

Xaml'de bağlamayı kurmayı denediniz, aşağıdakiler sizin için çalışmalıdır.

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

Aksi takdirde, temin ettik bağlama kod bakarak, bana etrafında yanlış bir şekilde görünüyor, bağlama hedefi ızgara sütun olmalı ve kaynağın bağımlılık özelliği olmalıdır.

yukarıda xaml için eşdeğer kod, bir GridSplitter kullanılarak ve genişlik özelliği bağlama Birlikte kullanılamayan olan İlgili bir

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

olup. Splitter'i kullanarak sütunu yeniden boyutlandırır tamamlamaz, bağlamanız, ayırıcıdan gelen değerle değiştirilir.

Bu, bir bağlamanın hedefi olan herhangi bir özelliği güncelleştirerek yaşayacağınız ile benzerdir. Hedef değeri doğrudan kodda ayarladığınızda, bağlayıcı nesneyi sağladığınız değerle değiştirirsiniz.

2

SütunDefinition.Width tam sayı değil - bir GridLength. GridLength'u doğrudan Tamsayıya bağlayamazsınız, bir dönüştürücüye ihtiyacınız vardır.

Ayrıca, bir Denetleyicinin Genişliği özelliğini (çift) bir dönüştürücü olmadan bir Sütun Uygulaması Genişliği özelliğine (GridLength) bağlayamamanızın nedeni de budur.