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