2013-01-02 23 views
5

Bir sol taraftaki gezinme panelini ve sağ taraftaki bir görüntü alanını (her ikisi de UserControls) ortaya koyan aşağıdaki MainWindow'u kullanıyorum.WPF: Set UserControl DataContext

Birisi, gezinme panelinin (LinksView.xaml) DataContext numarasının LinksViewModel.cs ürününe nasıl atanacağını açıklayabilir. Düğmeye bir Komut (BtnCompanyClickCommand) bağlamak ve LinksViewModel.cs içinde BtnCompanyClickCommand tanımlamak istiyorum.

DataContext'i ayarlamak için StackOVerflow üzerinde bulduğum çeşitli yöntemleri denedim, ancak bu çözümlerin hiçbiri işe yaramıyor gibi görünüyor (Bağıl Kaynağı, adlandırma görünümü ve adına bağlanma, vb.).

MainWindow.xaml

<StackPanel Orientation="Horizontal"> 
    <vw:LinksView DataContext="{Binding RelativeSource={RelativeSource Self}}"/> 
    <ContentControl Content="{Binding CurrentUserControl}" /> 

</StackPanel> 

LinksView.xaml

<StackPanel Orientation="Vertical"> 
    <Button Content="Company" Width="75" Margin="3" Command="{Binding ElementName=Links,Path=BtnCompanyClickCommand}" /> 
</StackPanel> 

FormsDictionary.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:vm="clr-namespace:SidekickAdmin.ViewModel" 
        xmlns:vw="clr-namespace:SidekickAdmin.View"> 

    <DataTemplate DataType="{x:Type vm:CompanySummaryViewModel}"> 
     <vw:CompanySummaryView> 
      <ContentControl Content="{Binding }" /> 
     </vw:CompanySummaryView> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:LinksViewModel}"> 
     <vw:LinksView /> 
    </DataTemplate> 

</ResourceDictionary> 

DÜZENLEME Yani nihayet UserControl ilk çocuk öğe üzerinde yapılması gereken bir UserControl DataContext'i nasıl ayarlanacağı bu explanation geldi.

İşte çalışan değiştirilmiş LinksView.xaml.

<StackPanel Orientation="Vertical"> 
    <StackPanel.DataContext> 
     <vm:LinksViewModel /> <!-- Bind the items in StackPanel to LinksViewModel --> 
    </StackPanel.DataContext> 

    <Button Content="Company" Width="75" Margin="3" Command="{Binding BtnCompanyClickCommand}" /> 
</StackPanel> 

Ancak, ben hala (FormsDictionary.xaml ayarlanır) Linksview için DataTemplate DataContext içine kravat yok neden Alt öğenin DataContext'i olup UserControl ve ayarlamak zorunda Sebebini değilim LinksViewModel. Herhangi bir açıklama takdir edilecektir.

+0

Düzenlemenize eklediğiniz DataContext parçasını kaldırırsanız hala çalışır mı? MainWindow görünümünün bu senaryoda ayarladığı veri kümesine sahip olacağınızı varsayacağım. –

+0

... öğesini düzenlediğimden kaldırırsam, LinksView'ın MainWindowViewModel'in bir DataContext'i var. – BrianKE

+0

Eğer LinksView'da ayarlanmış bir datacontext açıklık yoksa, WPF bir tane aramak için ağacı arar - sizin durumunuzda MainWindow'daki datacontext. –

cevap

0

İlk olarak, XAML kodunuzdaki DataContext (LinksViewModel.cs) öğesine başvurmanız gerekir. Bunu doğrudan örnekleyerek veya ResourceDictionary kullanarak yapabilirsiniz. İkinci durumda DataConext'inizi bazı .cs dosyasında veya ResourceDictionary .xaml dosyasının içinde örneklendirirsiniz ve daha sonra referansı bulabileceğiniz adlandırılmış bir ResourceDictionary dosyasında saklarsınız.

İkinci olarak, LinksView.xaml gibi bir View öğesinin DataContext özelliğini karşılık gelen DataContext ile ilişkilendirmeniz gerekir.

Bu oldukça yüksek düzeydedir ve herhangi bir kod içermez, ancak bunun arkasında yatan temel fikirdir.

+0

Teşekkürler, DataContext'i XAML'ye bağlamak zorunda olduğumu anladım ve sanki SO hakkındaki diğer sorularda önerilen çeşitli çözümleri denediğimi söyledim. Ancak, bunların benim uygulamamla çalışması için bunları alamıyorum, böylece birisinin gerçekten deneyebileceğim bir kod önerebileceğini umuyordum.DataSontextSourceDictionary içinde LinksView ayarlamayı deneyin ama bu işe yaramadı. – BrianKE

İlgili konular