2012-09-25 30 views
6

Tôi có một dự án WPF trong Windows 2012, trong đó tôi cần tải một số thông tin trong sự kiện Window Loaded. Tôi cần phải làm điều này trong Xem Model hơn là trong CodeBehind, mặc dù. Tôi đang cố gắng sử dụng đoạn mã sau:Window Loaded và WPF

Trong XAML của tôi:

<interactivity:Interaction.Behaviors> 
    <behaviors:WindowLoadedBehavior LoadedCommand="{Binding WindowLoadedCommand}" /> 
</interactivity:Interaction.Behaviors> 

Trong Xem các mẫu của tôi:

private DelegateCommand _WindowLoadedCommand; 

public DelegateCommand WindowLoadedCommand 
{ 
    get 
    { 
     return _WindowLoadedCommand; 
    } 
    private set 
    { 
     _WindowLoadedCommand = value; 
    } 
} 

public ShellViewModel() 
{ 
    WindowLoadedCommand = new DelegateCommand(WindowLoadedAction); 
} 

protected void WindowLoadedAction() 
{ 
    ... 
} 

hành vi gắn My:

public class WindowLoadedBehavior : Behavior<FrameworkElement> 
{ 
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Dependency Property. Allow public.")] 
    public static DependencyProperty LoadedCommandProperty = DependencyProperty.Register("LoadedCommand", typeof(ICommand), typeof(WindowLoadedBehavior), new PropertyMetadata(null)); 

    public ICommand LoadedCommand 
    { 
     get { return (ICommand)GetValue(LoadedCommandProperty); } 
     set { SetValue(LoadedCommandProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.Loaded += AssociatedObject_Loaded; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.Loaded -= AssociatedObject_Loaded; 

     base.OnDetaching(); 
    } 

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (LoadedCommand != null) 
      LoadedCommand.Execute(null); 
    } 
} 

Các OnAttached, AssociatedObject_Loaded và LoadedCommand nhận được là tất cả bắn, nhưng LoadedCommand thiết lập không phải là bắn và, rõ ràng , WindowLoadedCommand không kích hoạt. Bất kỳ đầu mối những gì tôi có thể làm để có được điều này làm việc?

+1

Bất kỳ lý do cụ thể nào mà bạn không ràng buộc lệnh trực tiếp? –

+0

Từ những gì tôi đã đọc, ràng buộc sự kiện Window Loaded trực tiếp không hoạt động vì một lý do nào đó. –

Trả lời

28

Có một vài tùy chọn. Một vài trong số họ được liệt kê ở đây:

how to call a window's Loaded event in WPF MVVM?

Tuy nhiên, trong cơ hội ra rằng bạn hay bất cứ ai quan tâm rằng bạn đang dành vài giờ để hoàn thành một nhiệm vụ mà lẽ ra phải được thực hiện trong 30 giây, bạn có thể muốn thử thay vào đó.

public MainWindow() 
{ 
    InitializeComponent(); 

    this.Loaded += new RoutedEventHandler(MainWindow_Loaded); 
} 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    ShellViewModel.Instance.WindowLoadedCommand.Execute(null); 
} 
+2

Điều đó thật hoàn hảo! Rõ ràng vấn đề tôi đang gặp phải là các lớp xử lý sự kiện không được nạp đúng cách trước khi cửa sổ đang tải. Phương pháp của bạn (cùng với ngắn và đến điểm) tránh được điều đó và cho phép nó bắn đúng cách. –

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