2012-09-12 95 views
3

這可能是重複的問題,但我找不到解決方案,我的問題。BusyIndi​​cator使用MVVM

我正在使用MVVM模式的WPF應用程序。

有四個視圖綁定到他們的ViewModels。所有ViewModel都具有BaseViewModel作爲父級。

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    private bool isbusy; 

    public bool IsBusy 
    { 
     get 
     { 
      return isbusy; 
     } 
     set 
     { 
      isbusy = value; 
      RaisePropertyChanged("IsBusy"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

的MainView包含BusyIndi​​cator控件:

<extWpfTk:BusyIndicator IsBusy="{Binding IsBusy}"> 
     <ContentControl /> 
    </extWpfTk:BusyIndicator> 

如果設置IsBusy =在MainViewModel真,BusyIndi​​cator控件被示出。

如果我嘗試從其他ViewModels設置IsBusy = true,則不顯示BusyIndi​​cator。

只是要注意,我不能在MVVMLight之類的項目中使用第三方庫,以便使用他們的Messenger在ViewModels之間進行通信。

的MainView:

public class MainWindowViewModel : ViewModelBase 
{ 
    public ViewModel1 ViewModel1 { get; set; } 
    public ViewModel2 ViewModel2 { get; set; } 
    public ViewModel3 Model3 { get; set; } 

    public MainWindowViewModel() 
    { 
     ViewModel1 = new ViewModel1(); 
     ViewModel2 = new ViewModel2(); 
     ViewModel3 = new ViewModel3(); 
     //IsBusy = true; - its working 
    } 
} 

ViewModel1:

public class ViewModel1 : ViewModelBase 
{ 
    RelayCommand _testCommand; 

    public ViewModel1() 
    { 
    } 

    public ICommand TestCommand 
    { 
     get 
     { 
      if (_testCommand == null) 
      { 
       _testCommand = new RelayCommand(
        param => this.Test(), 
        param => this.CanTest 
        ); 
      } 
      return _testCommand; 
     } 
    } 

    public void Test() 
    { 
     //IsBusy = true; - BusyIndicator is not shown 

    } 

    bool CanTest 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 
+0

僅供參考MVVMLight是開源的,您可以輕鬆地提取Messenger實施並放棄其餘 - 直接在您的解決方案中提供源代碼,因此不需要任何第三方庫。 –

+0

@AdamHouldsworth那麼,從某種原因,當我試圖使用MVVMLight中的WeakReference類時,我得到了SecurtyException。我也嘗試了Mediator模式,但在WeakReference SecurityException中遇到了問題。 –

+0

@GazTheDestroyer其他四個視圖不包含對MainView的引用。 –

回答

4
public class MainWindowViewModel : ViewModelBase 
    { 
    public ViewModel1 ViewModel1 { get; set; } 
    public ViewModel2 ViewModel2 { get; set; } 
    public ViewModel3 Model3 { get; set; } 

    public MainWindowViewModel() 
    { 
     ViewModel1 = new ViewModel1(); 
     ViewModel2 = new ViewModel2(); 
     ViewModel3 = new ViewModel3(); 
     ViewModel1.PropertyChanged += (s,e) => 
     { 
      if(e.PropertyName == "IsBusy") 
      { 
       // set the MainWindowViewModel.IsBusy property here 
       // for example: 
       IsBusy = ViewModel1.IsBusy; 
      } 
     } 
    //IsBusy = true; - its working 
    } 
} 

Repeate subcsription到所有的ViewModels。

不要忘了退出事件,當你不需要它時,避免內存不足。

你的問題是:你綁定到MainWindowViewModel的propetry,而不是內部ViewModel的屬性。

+0

我綁定到了BaseViewModel屬性,該屬性在所有ViewModel中都可見。如果我更改IsBusy屬性,是否所有視圖都會收到通知? –

+1

不,綁定不是魔術。你有4個實例。 * MainWindowViewModel *,* ViewModel1 * ect,它們中的每一個都有**它自己的** * IsBusy * propetry。當你設置* ViewModel1.IsBusy = true *,其他IsBusy仍然是* false *。 –

+0

當你在xaml中設置bindind時,你連接了* MainWindowViewModel.IsBusy *屬性並且它可以工作。但是您的視圖無法檢測到其他* IsBusy *屬性。所以,你必須通知View手冊。 –

相關問題