2008-09-29 18 views
28

, ben Heights ve ızgara kontrolleri için çeşitli tanımların genişlikleri databind çalışıyorum, bu yüzden bir GridSplitter kullandıktan sonra kullanıcı bunları ayarlar değerlerini saklayabilir. Bununla birlikte, normal model bu özelliklerde işe yaramaz.Bir ColumnDefinition'ın Genişliğini veya RowDefinition's Yüksekliğini nasıl ekleyebilirim? WPF için ViewModel-ViewModel desen altında

Not: Google bana başarısız oldu ve kendimi bu işe zorunda gibi post ediyorum bir referans soru olarak bu post ediyorum. Takip etmek için kendi cevabım.

cevap

17

keşfettim FRİKİKLERİNDEN bir dizi vardı: XAML bir çift gibi görünse

  1. , a * tanım yüksekliğini veya genişliğini için gerçek değer bir 'GridLength' yapı olduğunu. GridLength ait
  2. Tüm özellikleri, yeni bir tane bunu değiştirmek her zaman oluşturmak zorunda, salt okunur özelliktedir. WPF, Genişlik ve Yükseklik bütün diğer mülkiyet aksine
  3. 'TwoWay' kendi veri bağlama modu varsayılan yoktur, elle bu ayarlamanız gerekir.

    private GridLength myHorizontalInputRegionSize = new GridLength(0, GridUnitType.Auto) 
    public GridLength HorizontalInputRegionSize 
    { 
        get 
        { 
         // If not yet set, get the starting value from the DataModel 
         if (myHorizontalInputRegionSize.IsAuto) 
          myHorizontalInputRegionSize = new GridLength(ConnectionTabDefaultUIOptions.HorizontalInputRegionSize, GridUnitType.Pixel); 
         return myHorizontalInputRegionSize; 
        } 
        set 
        { 
         myHorizontalInputRegionSize = value; 
         if (ConnectionTabDefaultUIOptions.HorizontalInputRegionSize != myHorizontalInputRegionSize.Value) 
         { 
          // Set the value in the DataModel 
          ConnectionTabDefaultUIOptions.HorizontalInputRegionSize = value.Value; 
         } 
         OnPropertyChanged("HorizontalInputRegionSize"); 
        } 
    } 
    

    Ve XAML:

surette de ben şu kodu kullanılmış sen GridLength ve int arasında dönüştürme açtığına göre,

<Grid.RowDefinitions> 
    <RowDefinition Height="*" MinHeight="100" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="{Binding Path=HorizontalInputRegionSize,Mode=TwoWay}" MinHeight="50" /> 
</Grid.RowDefinitions> 
+9

GridLength, WPF'ye özgüdür, bu nedenle ViewModel katmanına ait değildir. –

+2

"ViewModel'de WPF yok" inancı yanlıştır, çünkü WPF'nin MVVM düzeni ile ilgili çok fazla yapısı vardır; Bunun yerine, "GridLength, VIEW özeldir" diyebilir, bunun yerine (çok yönlü kullanımı düzeni ve görüntüleri görüntülemek olan veri görselleştirme uygulamalarında olduğu gibi, etki alanı sorununun bir parçası değilse). Ama emin tartışmalı ... – heltonbiker

+0

@heltonbiker "GridLength VIEW özeldir" daha doğrudur. Eğer çok benzeyen sorun çözüm aramaya Eğer iş mantığı –

4

başka olasılık, bir IValueConverter yaratmaktır ve Width'a bağlanırken kullanın. IValueConverter s ayrıca iki yönlü bağlamayı da ele alır; çünkü bunlar hem ConvertTo() hem de ConvertBack() yöntemlerine sahiptir.

public class GridLengthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     double val = (double)value; 
     GridLength gridLength = new GridLength(val); 

     return gridLength; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     GridLength val = (GridLength)value; 

     return val.Value; 
    } 
} 

Daha sonra senin Bağlama içinde dönüştürücü yararlanabilirler: şu şekildedir:

34

bir IValueConverter oluşturma

<UserControl.Resources> 
    <local:GridLengthConverter x:Key="gridLengthConverter" /> 
</UserControl.Resources> 
... 
<ColumnDefinition Width="{Binding Path=LeftPanelWidth, 
            Mode=TwoWay, 
            Converter={StaticResource gridLengthConverter}}" /> 
+0

sadece kısmen veya UI düzen (tasarım) hakkında olmadıkça , buradan bulabilirsiniz: http://stackoverflow.com/questions/7660967/wpf-error-cannot -find-govering-frameworkelement-for-target öğesi – dzendras

+0

Wpf zaten bir GridLengthConverter sınıfına sahiptir. Bunu olduğu gibi kullanmak mümkün mü? – heltonbiker

+4

@heltonbiker Ne yazık ki, GridLengthConverter IValueConverter yerine ITypeConverter uygular ve bu yüzden WPF ciltleme dönüşümü olarak kullanılamaz. –

2

en kolay çözümdür sadece bu özelliklerin dize ayarlarını kullanmak için WPF olacak şekilde Ekstra çalışma olmadan GridLengthConverter kullanarak bunları otomatik olarak destekler.

İlgili konular