Wpf

2016-03-23 21 views
0

'daki farklı bir koleksiyona bağlı olan bir ağaca bağlı olan bir kılavuza nasıl bağlanır Tamam, bu açıklamak zor. Ağacı olan ve bir formu olan bir manzaram var. Ağaç, 2 farklı gözlemlenebilir koleksiyona bağlanmıştır.Wpf

<TreeView FontFamily="Calibri" FontSize="16" Name="tree" Margin="3" Grid.Row="1" Grid.Column="0" Height="950" VerticalAlignment="Top" Grid.ColumnSpan="2" 

       ItemsSource="{Binding Path=Org, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItemChanged="tree_SelectedItemChanged" >    

    <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=Org_Sredstva}"> 
       <TextBlock Text="{Binding Path=Organizacije_Naziv}"/> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=Ossr_Naziv}"/> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

Şimdi ağacın yanında bir form var. Ve formun, ağacın seçili olmasına bağlı olarak değişen üçüncü gözlemlenebilir bir koleksiyona bağlı olması gerekiyor. Eğer bağlama görebileceğiniz gibi

<Grid Grid.Row="2" Grid.Column="2" Margin="5" DataContext="{Binding ElementName=tree, Path=SelectedItem}"> 

farklı gözlemlenebilir koleksiyonu bağlı ağaca etmektir.

<extToolkit:WatermarkTextBox x:Name="RadnoVrijeme" Grid.Row="1" 
        Grid.Column="1" 
        Grid.ColumnSpan="2" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Bottom" 
         Width="100" 
        Height="25" 
        Padding="3" 
        Margin="3" 
        AcceptsReturn="True" 
        Validation.ErrorTemplate="{StaticResource ValidationTemplate}" 
        Validation.Error="Validation_Error"> 
        <extToolkit:WatermarkTextBox.Watermark> 
         <StackPanel Orientation="Horizontal"> 
          <TextBox Text="Radno Vrijeme" Margin="4,2,2,0" FontWeight="Regular" Foreground="Silver" BorderThickness="0"/> 
         </StackPanel> 
        </extToolkit:WatermarkTextBox.Watermark> 
        <extToolkit:WatermarkTextBox.Text> 
         <Binding Path="Opr_RadnoVrijeme" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"> 
          <Binding.ValidationRules> 
           <validation:InputLenghtRule MinLength="10" MaxLength="250" ValidatesOnTargetUpdated="True"/> 
          </Binding.ValidationRules> 
         </Binding> 
        </extToolkit:WatermarkTextBox.Text> 
       </extToolkit:WatermarkTextBox> 

Bu metin kutusu olduğunu ve üçüncü koleksiyonu bir özelliğine bağlı ama bu koleksiyon her yerde ItemsSource set asla çünkü açıkça çalışmaz. codebehind her metin kutusu ayarlamak için

buldum geçici çözüm tek tek burada denklemin sol tarafı metin kutusu ve sağ tarafta text özelliğini ise

this.View.RadnoVrijeme.Text = opr.Opr_RadnoVrijeme; 

collection.property olmasıdır. Bu işe yarıyor ama hoşlanmıyorum ve bunu gerçekten bağlamanın bir yolu olduğunu mu umuyordum?

cevap

0

Kesinlikle MVVM'ye bir göz atmalısınız. Görünümünüzün ViewModels tarafından kontrol edilen çoklu Görünümlerden oluştuğu modüler tasarımı kullanır. Ardından her türlü bağımlılık (ilişki seçimi?) Problemini çözmek kolaydır. Senin durumunda

Eğer MVVM sen selection idare edecek olurken, doğrudan SelectedItem bağlanan çalışıyoruz ve daha sonra otomatik olarak Görünüm elemanı karşılık gelen güncelleştirmeyi neden olacaktır ilgili mülkiyet değişikliği bildirimini yükselmeye imkanı vardır. İşte

genel örnektir:

ItemVM _selectedItem; 
public ItemVM SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged(); 
     // trigger update in the view 
     OnPropertyChanged(nameof(SomeRelatedProperty)); 
    } 
} 

// bind TextBlock.Text to that property 
public string SomeRelatedProperty 
{ 
    get 
    { 
     // some logic based on selected item 
     if(SelectedItem.SomeProperty == SomeValue) 
      return "a"; 
     ... 
     return "b"; 
    } 
} 

zaten o zaman basitçe doğrudan o mülke bağlayabilir INotifyPropertyChanged uygulamak tüm ViewModels varsayarak, mülkiyet biri (bunun nedeni bir ViewModel) olarak değer sağlar SelectedItem eğer soğutucu şey seçili öğe değiştiğinde ve görünümü çok o mülkü göstermek için güncellenecektir:

<TextBlock Text="{Binding SelectedItem.SomeProperty} .../> 

f gibi ya da alıyorsanız hata:

System.Windows.Data Error: 40 : BindingExpression path error: 'Opr_RadnoVrijeme' property not found on 'object' ''Organizacije' (HashCode=23451234)'. BindingExpression:Path=Opr_RadnoVrijeme; DataItem='Organizacije' (HashCode=23451234); target element is 'WatermarkTextBox' (Name='RadnoVrijeme'); target property is 'Text' (type 'String')

(, bunu anlamaya ViewModels vermedi oldukça emin) bağlayıcı deneyin:

<WatermarkTextBox Text="{Binding SelectedItem.Opr_RadnoVrijeme, RelativeSource={RelativeSource FindAncestor, AncestorType=TreeView}}" ... /> 
+0

Evet ama Seçilen öğe olduğunu özelliği nedeniyle içermiyor onun Farklı bir sınıf için farklı bir koleksiyon. Ayrıca Model View sunum modeline sahip CastleActiveRecords uygulamasını veya en azından denedim. Inotify'ı uyguluyorum. Bkz bu BindingExpression yolu hatasının benim sorunu tür: 'Opr_Povrsina' özelliği 'nesne' 'bulunmayan Organizacije' Bu benim çıkış hatası ve Organizacije Opremljenosti tutun yapar nesne Opr_Povrsina özelliğini tutmaz nesne olduğu ama ona nasıl bağlanacağımı bilmiyorum çünkü ağaç için Organizacije'ye de ihtiyacım var. –

+0

Burada 2 koleksiyonumda Property Change'i kullanabiliyorum ama benim için çalışmıyor, yanlış bir şey yapıyorum ... public ObservableCollection Oprema {{return _oprema; } { _oprema = value; OnPropertyChanged ("Oprema"); } } kamu ObservableCollection Kuruluş { olsun {return _organizacije; } set { _organizacije = value; OnPropertyChanged ("Org"); } } –

+0

Sınıfların hiyerarşisini göstermediniz, ancak 'SelecteItem' metni görüntülemek için kullanılan bilgileri sağlamalı, sonra ilk yaklaşımı (ilgili özellik için yükselen bildirim) kullanarak hangi değerin görüntüleneceğine karar vermek için kullanılabilir. "CastelActiveRecords" (MVP?) Nedir bilmiyorum, ama wpf çoğu için MVVM ile ilişkilidir, ViewModel genellikle "INotifyPropertyChanged" uygular. ViewModel'lerinizi gösterebilir misiniz? Ve mevcut yönteminiz de metin değerini ayarlamanız için lütfen. – Sinatr