2013-01-02 43 views
5

Tôi có MainWindow sau đây đặt bảng điều hướng bên trái và khu vực hiển thị bên phải (cả hai là UserControls).WPF: Đặt UserControl DataContext

Ai đó có thể giải thích cách gán DataContext của bảng điều hướng (LinksView.xaml) cho số LinksViewModel.cs. Tôi muốn liên kết Lệnh (BtnCompanyClickCommand) với nút và xác định BtnCompanyClickCommand trong LinksViewModel.cs.

Tôi đã thử các phương pháp khác nhau mà tôi tìm thấy trên StackOVerflow để đặt DataContext nhưng không có giải pháp nào trong số này có hiệu quả (liên kết RelativeSource, đặt tên và gắn kết với tên, v.v.).

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> 

EDIT

Vì vậy, cuối cùng tôi đã xem qua số này explanation cách đặt DataContext của UserControl phải được thực hiện trên mục con đầu tiên của UserControl.

Đây là LinksView.xaml đã sửa đổi hoạt động.

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

Tuy nhiên, tôi vẫn không rõ ràng về lý do tại sao tôi phải đặt DataContext của phần tử con và không phải là UserControl và tại sao DataTemplate cho LinksView (thiết lập trong FormsDictionary.xaml) không buộc vào DataContext của LinksViewModel. Mọi lời giải thích sẽ được đánh giá cao.

+0

Tính năng này vẫn hoạt động nếu bạn xóa phần DataContext mà bạn đã thêm vào bản chỉnh sửa của mình? Tôi sẽ giả định rằng bạn sẽ có tập dữ liệu datacontext của khung nhìn MainWindow trong kịch bản này. –

+0

Nếu tôi xóa ... khỏi bản chỉnh sửa của tôi thì LinksView có một DataContext của MainWindowViewModel. – BrianKE

+0

Nếu không có bối cảnh dữ liệu được thiết lập trên LinksView, WPF sẽ đi lên cây tìm kiếm một - trong trường hợp của bạn là datacontext trên MainWindow. –

Trả lời

0

Trước tiên, bạn phải tham khảo DataContext (LinksViewModel.cs) trong mã XAML của mình. Bạn có thể làm điều đó bằng cách trực tiếp khởi tạo hoặc sử dụng ResourceDictionary. Trong trường hợp sau bạn khởi tạo DataConext của bạn hoặc bên trong một số tệp .cs hoặc bên trong tệp ResourceDictionary .xaml và lưu trữ nó trong một ResourceDictionary có tên, nơi bạn có thể tìm thấy tham chiếu sau này.

Thứ hai, bạn chỉ cần liên kết thuộc tính DataContext của phần tử Chế độ xem như LinksView.xaml với DataContext tương ứng.

Đây là cấp độ khá cao và không có bất kỳ mã nào nhưng đó là ý tưởng cơ bản đằng sau nó.

+0

Cảm ơn, tôi hiểu rằng tôi phải kết nối DataContext với XAML và như tôi đã nói tôi đã thử các giải pháp khác nhau được đề xuất trên các câu hỏi khác về SO. Tuy nhiên, tôi không thể có được những điều này để làm việc với ứng dụng của tôi vì vậy tôi đã hy vọng một người nào đó có thể thực sự đề xuất một số mã mà tôi có thể thử.Tôi đã cố gắng thiết lập DataContext của LinksView trong ResourceDictionary nhưng điều đó không hoạt động. – BrianKE

Các vấn đề liên quan