2011-01-12 35 views
5

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

+2

Bạn có gì cho đến nay? Đăng một số mã. – decyclone

+4

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

+0

@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

Trả lời

6

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ị).

+4

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

13

đâ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"); 
      } 
     } 
    } 
0

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

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