Tôi đã gắn thuộc tính "WindowState" của cửa sổ chính vào ViewModel để thay đổi trạng thái của cửa sổ bằng lệnh, nhưng lần đầu tiên tôi thu nhỏ cửa sổ nó thu nhỏ như một bảng tính trong một tệp Excel. Có một công việc xung quanh cho điều này hoặc một cách chính xác để ràng buộc tài sản "WindowState" để ViewModel của tôi để cửa sổ giảm thiểu một cách chính xác?Ràng buộc thuộc tính "WindowState" của một cửa sổ trong WPF bằng cách sử dụng MVVM
Trả lời
Tôi không nghĩ rằng bạn nên quan tâm về tình trạng cửa sổ trong một mô hình xem, đó là hoàn toàn sai vì một lớp cấp thấp hơn là nhận thức của một cao hơn lớp -level (do đó sai tách mối quan tâm (SOC)).
Điều tôi thường làm trong trường hợp này là đăng ký thay đổi trong mô hình khung nhìn từ mã phía sau của điều khiển hoặc cửa sổ (do đó chế độ xem) chứa mô hình khung nhìn. Trong trường hợp này, nó là hợp lệ để viết mã trong mã-đằng sau bởi vì nó chỉ được sử dụng trong khung nhìn (và do đó mã-đằng sau là vị trí hoàn hảo cho logic này, mà bạn thực sự không muốn kiểm tra đơn vị).
Trong khi điều này nói chung là đúng, nó cũng có thể cho mô hình xem để lộ một tài sản không liên quan đến 'WindowState' mà nên dictate giá trị của nó. Ví dụ, một trong các mô hình khung nhìn của tôi chứa Boolean 'ShowResults'. Tôi muốn điều này để chuyển đổi 'WindowState' thành' Maximize', vì vậy tôi đã tạo một BoolToWindowStateConverter. – Pakman
đây là công việc mẫu xung quanh thử nghiệm với Relaying Command Logic. Bạn sẽ nhận được thông tin chi tiết hơn trên WPF Apps With The Model-View-ViewModel Design Pattern.
<Window x:Class="WpfMvvmTestCSharp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfMvvmTestCSharp"
Title="Window1" Height="300" Width="300" WindowState="{Binding CurWindowState, Mode=TwoWay}">
<Window.DataContext>
<vm:Window1ViewModel/>
</Window.DataContext>
<Grid>
<Button Command="{Binding CmdMax}" Height="23" Margin="12,25,0,0" Name="button1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75">Maximize</Button>
<Button Command="{Binding CmdMin}" Height="23" Margin="101,25,102,0" Name="button2" VerticalAlignment="Top">Minimize</Button>
<Button Command="{Binding CmdRes}" Height="23" HorizontalAlignment="Right" Margin="0,25,13,0" Name="button3" VerticalAlignment="Top" Width="75">Restore</Button>
</Grid>
</Window>
và trong Windows ViewModel
class Window1ViewModel:ViewModelBase
{
public Window1ViewModel()
{
CurWindowState = WindowState.Maximized;
}
public ICommand CmdMax
{
get { return new RelayCommand(param => onCmdMax()); }
}
void onCmdMax()
{
CurWindowState = WindowState.Maximized;
}
public ICommand CmdMin
{
get { return new RelayCommand(param => onCmdMin()); }
}
void onCmdMin()
{
CurWindowState = WindowState.Minimized;
}
public ICommand CmdRes
{
get { return new RelayCommand(param => onCmdRes()); }
}
void onCmdRes()
{
CurWindowState = WindowState.Normal;
}
private WindowState _curWindowState;
public WindowState CurWindowState
{
get
{
return _curWindowState;
}
set
{
_curWindowState = value;
base.OnPropertyChanged("CurWindowState");
}
}
}
Một tùy chọn khác để xem xét là đăng ký cả hai thông qua một lệnh AND một sự kiện mã phía sau, ví dụ:
<Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button>
Lệnh trong trường hợp này ảnh hưởng đến VM. Sự kiện Nhấp chuột, chỉ thay đổi trạng thái Cửa sổ.
- 1. WPF: Cửa sổ được giảm thiểu ngay cả khi cài đặt WindowState rõ ràng
- 2. Ràng buộc WPF và Phân công động Thuộc tính StringFormat
- 3. OneWay ràng buộc cho thuộc tính IsChecked ToggleButton trong WPF
- 4. Thuộc tính cha mẹ ràng buộc WPF trong HierarchicalDataTemplate
- 5. WPF ràng buộc thuộc tính của usercontrol vào thuộc tính của cha mẹ
- 6. nút đóng cửa sổ xử lý trong wpf MVVM
- 7. Tương tự thuộc tính AcceptButton trong lớp cửa sổ WPF?
- 8. WPF: Tự động ràng buộc danh sách (một số) thuộc tính của đối tượng
- 9. Thuộc tính ràng buộc trong mã phía sau
- 10. WPF sử dụng MVVM: DataBinding với RelativeSource
- 11. Thuộc tính Animate 'Style' của Kiểm soát bằng cách sử dụng ObjectAnimationUsingKeyFrames trong WPF
- 12. Bộ công cụ wpf DateTimePicker ràng buộc
- 13. Nền tế bào DataFrid WPF bằng cách sử dụng ràng buộc
- 14. Nút radio WPF - MVVM - ràng buộc dường như chết?
- 15. Dữ liệu thuộc tính WPF ràng buộc để phủ nhận thuộc tính
- 16. Sử dụng ràng buộc cho thuộc tính Giá trị của điều kiện DataTrigger
- 17. làm cách nào để gọi sự kiện đã tải của cửa sổ trong WPF MVVM?
- 18. MVVM ràng buộc với InkCanvas
- 19. WPF Ràng buộc một ListBox vào một enum, hiển thị các thuộc tính mô tả
- 20. WPF và MVVM: Thay đổi chuyển đổi ràng buộc dữ liệu khi chạy
- 21. Làm cách nào để đặt ViewModel trên một cửa sổ trong XAML bằng cách sử dụng thuộc tính DataContext?
- 22. Sử dụng PasswordBox với WPF - MVVM
- 23. Vấn đề với sự ràng buộc Tiêu đề của cửa sổ WPF trên thuộc tính trong lớp mô hình xem vỏ [Caliburn.Micro]
- 24. WPF: Tôi có thể buộc cửa sổ đánh giá lại tất cả các ràng buộc và xác thực của cửa sổ không?
- 25. Silverlight: Thuộc tính điều khiển ràng buộc theo lập trình
- 26. Cách sử dụng Điều khiển người dùng trong WPF MVVM
- 27. Sử dụng WPF DataGridComboBoxColumn với MVVM - Liên kết với Thuộc tính trong ViewModel
- 28. Ràng buộc Trình kích hoạt kiểu WPF vào thuộc tính phụ thuộc tùy chỉnh
- 29. MVVM - ẩn điều khiển khi thuộc tính bị ràng buộc không có mặt
- 30. Cửa sổ con Silverlight trong mẫu MVVM
Bạn có gì cho đến nay? Đăng một số mã. – decyclone
Nếu không biết nền tảng của những gì bạn đang cố gắng làm, có vẻ như bạn có thể đang sử dụng thiết bị ViewModel một bước quá xa. Những thứ hoàn toàn là logic UI hoàn toàn có thể chấp nhận được trong code-behind và trên thực tế không có doanh nghiệp nào trong ViewModel. Tôi sẽ nói điều này bao gồm những thứ như tập trung và trạng thái cửa sổ. – Josh
@Josh Enstein Tôi chuyển sang sử dụng mã phía sau như bạn đã nói, giờ đây nó hoạt động hoàn hảo. Những gì tôi đang cố gắng làm là ẩn nút thanh tác vụ khi cửa sổ được thu nhỏ và sử dụng một mục menu được gắn vào biểu tượng trên thanh tác vụ để đưa cửa sổ trở lại. – norlando