2015-09-28 22 views
1

因此,與PRISM玩,我有一個網格誰的Visibility屬性綁定到視圖模型中的屬性,如此。棱鏡SetProptery不開火通知?

的XAML

Grid Grid.RowSpan="2" Grid.ColumnSpan="3" Background="#7F808080" Visibility="{Binding LoadingVisibility}"> 

代碼隱藏

private Visibility loadingVisibility = Visibility.Visible; 

public Visibility LoadingVisibility 
{ 
    get 
    { 
     return loadingVisibility; 
    } 
    set 
    { 
     SetProperty(ref loadingVisibility, value); 
    } 
} 

現在,如果我這樣做LoadingVisibility = Visibility.Collapsed;,網格不會消失,仍清晰可見。

如果我再在SetProperty(ref loadingVisibility, value);設置斷點,我可以看到的loadingVisibility原始值,被設定爲Visibile,我可以看到value設置爲Collapsed。 如果我再踩下去,我可以看到loadingVisiblity現在已經改爲collapsed。在這一點上,我期望Grid被通知,然後執行'獲取'來檢索值。這不會發生。

綁定正在工作,因爲裝載時調用了Get,並且如果我將private Visibility loadingVisibility = Visibility.Visible;更改爲Collapsed並運行代碼,網格開始隱形。

所以我的問題是,執行SetProperty後,爲什麼Get不是?

編輯: 只要你能看到我設置的屬性。

public ShellViewModel(IEventAggregator IEventAggregator) 
{ 
     IEventAggregator.GetEvent<PubSubEvent<HardwareLoaded>>().Subscribe(x => 
     { 
      if (!x.HardwareOK) 
      { 
       MessageBox.Show("There was an issue loading hardware. See Log"); 
      } 

      LoadingVisibility = Visibility.Collapsed;   
     }); 
} 

編輯2: 剛發現一些有趣的事情,如果我註釋掉SubscribeLoadingVisibility = Visibility.Collapsed;,然後添加一個按鈕XAML和具有click事件,像這樣則一切正常。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
     mvm.LoadingVisibility = Visibility.Collapsed; 
} 

所以現在我想的問題是爲什麼,當這兩種方法調用一套物業,確實只有一個工作充分,並導致Get工作?

+0

沒有它的訂閱EventAggregator。我在那裏放置了一個斷點,它確實被執行了。 – Gaz83

+0

檢查**輸出窗口**是否有綁定錯誤。 –

+0

@MikeEason已經做到了,看不到任何。 – Gaz83

回答

1

很多時候使用EventAggregator時,你正在使用UI線程。但看到HardwareLoaded類型,它告訴我,你可能會在另一個線程上做一些檢查。正如我們所知,綁定必須從UI線程更新。通常你會使用Dispather.BeginInvoke,但是Prism的EventAggregator在Subscribe方法中有一個重載,以告訴處理器卸載到UI線程。

IEventAggregator.GetEvent<PubSubEvent<HardwareLoaded>>().Subscribe(x => 
{ 
    if (!x.HardwareOK) 
    { 
     MessageBox.Show("There was an issue loading hardware. See Log"); 
    } 

    LoadingVisibility = Visibility.Collapsed; 
}, ThreadOption.UIThread); 
+1

綁定不必在UI線程上更新,因爲WPF自動將「PropertyChanged」事件分派給主線程。所以任何線程都可以更新任何標量屬性。對於收藏品,這不是事實。 – dymanoid