Tôi đang phát triển ứng dụng LOB, nơi tôi sẽ cần nhiều cửa sổ hộp thoại (và hiển thị mọi thứ trong một cửa sổ không phải là một tùy chọn/không giác quan).WPF: mẫu hoặc UserControl với 2 (hoặc nhiều hơn!) Người trình bày nội dung để hiển thị nội dung trong 'slots'
Tôi muốn có một điều khiển người dùng cho cửa sổ của tôi có thể xác định kiểu dáng, v.v., và sẽ có một số vị trí vị trí chèn nội dung - ví dụ: nội dung và các nút (để người dùng có thể cung cấp nội dung và tập hợp các nút bằng ICommands bị ràng buộc).
Tôi muốn có một cái gì đó như thế này (nhưng điều này không làm việc):
UserControl XAML:
<UserControl x:Class="TkMVVMContainersSample.Services.Common.GUI.DialogControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
>
<DockPanel>
<DockPanel
LastChildFill="False"
HorizontalAlignment="Stretch"
DockPanel.Dock="Bottom">
<ContentPresenter ContentSource="{Binding Buttons}"/>
</DockPanel>
<Border
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
Padding="8"
>
<ContentPresenter ContentSource="{Binding Controls}"/>
</Border>
</DockPanel>
</UserControl>
là một cái gì đó như thể này? Làm thế nào tôi nên nói với VS rằng kiểm soát của tôi cho thấy hai phần giữ chỗ nội dung để tôi có thể sử dụng nó như thế này?
<Window ... DataContext="MyViewModel">
<gui:DialogControl>
<gui:DialogControl.Controls>
<!-- My dialog content - grid with textboxes etc...
inherits the Window's DC - DialogControl just passes it through -->
</gui:DialogControl.Controls>
<gui:DialogControl.Buttons>
<!-- My dialog's buttons with wiring, like
<Button Command="{Binding HelpCommand}">Help</Button>
<Button Command="{Binding CancelCommand}">Cancel</Button>
<Button Command="{Binding OKCommand}">OK</Button>
- they inherit DC from the Window, so the OKCommand binds to MyViewModel.OKCommand
-->
</gui:DialogControl.Buttons>
</gui:DialogControl>
</Window>
Hoặc có lẽ tôi có thể sử dụng một ControlTemplate cho một cửa sổ like here, nhưng sau đó một lần nữa: Window chỉ có một khe nội dung, do đó mẫu của nó sẽ có thể chỉ có một người dẫn chương trình, nhưng tôi cần hai (và nếu trong Trong trường hợp này, có thể sử dụng một số trường hợp khác, nơi một số vùng nội dung sẽ đến, chỉ cần nghĩ về một mẫu cho người dùng điều khiển sẽ cung cấp một tiêu đề, nội dung có cấu trúc, tên tác giả, hình ảnh. ..).
Cảm ơn bạn!
PS: Nếu tôi muốn chỉ có các nút cạnh nhau, làm cách nào tôi có thể đặt nhiều nút điều khiển (nút) cho StackPanel? ListBox có ItemsSource, nhưng StackPanel có không, và nó sở hữu Trẻ em là chỉ đọc - vì vậy điều này không làm việc (bên trong usercontrol):
<StackPanel
Orientation="Horizontal"
Children="{Binding Buttons}"/>
EDIT: Tôi không muốn sử dụng ràng buộc, như tôi muốn gán một DataContext (ViewModel) cho toàn bộ cửa sổ (bằng View), và sau đó liên kết với các lệnh của nó từ các nút được chèn vào 'slots' điều khiển - vì vậy bất kỳ việc sử dụng ràng buộc nào trong cấu trúc phân cấp sẽ phá vỡ kế thừa của DC của View.
Đối với ý tưởng kế thừa từ HeaderedContentControl - có, trong trường hợp này nó sẽ hoạt động, nhưng nếu tôi muốn ba phần có thể thay thế thì sao? Làm cách nào để tạo "HeaderedAndFooteredContentControl" của riêng mình (hoặc, làm cách nào để triển khai HeaderedContentControl nếu tôi không có)?
EDIT2: OK, vì vậy hai giải pháp của tôi doen't công việc - đây là lý do tại sao: Các ContentPresenter được nội dung của nó từ DataContext, nhưng tôi cần các ràng buộc trên chứa các yếu tố liên kết đến các cửa sổ ban đầu (mẹ UserControl của trong cây logic) DataContext - bởi vì cách này, khi tôi nhúng hộp văn bản bị ràng buộc vào tài sản của ViewModel, nó không bị ràng buộc, như là chuỗi thừa kế đã bị phá vỡ bên trong điều khiển!
Có vẻ như tôi sẽ cần lưu DataContext của cha mẹ và khôi phục nó cho con của tất cả các vùng chứa của điều khiển, nhưng tôi không nhận được bất kỳ sự kiện nào mà DataContext trong cây logic đã thay đổi.
EDIT3: Tôi có giải pháp!, đã xóa các aswers trước đó của tôi. Xem câu trả lời của tôi.
Cảm ơn chúa đã giải thích điều này một cách đơn giản và dễ hiểu! Thật khó để tìm tài nguyên về điều này, hoặc nó chỉ là một lỗi wpf-beginners: p – Shion