2010-09-06 93 views
11

我想創建一個像MDI選項卡式界面,所以我有一個左側的導航窗格(Listbox)和右側的ContentPresenter。將命令綁定到ListView中的按鈕與Caliburn.Micro

我有了一個BindableCollection它稱爲AvailAbleScreens,我成功地設法綁定到該列表與列表視圖的DataTemplate一個ShellViewModel:

<ListView x:Name="AvailableScreens"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <WrapPanel> 
       <BulletDecorator /> 
       <Button x:Name="DisplayView"> 
        <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> 
       </Button> 
      </WrapPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 

現在的問題是,雖然按鈕的名稱設置正確地說,我不能讓命令爲我着火。 在MdiViewModel類我該按鈕的下面的代碼:

public bool CanDisplayView() 
{ 
    return true; 
} 

public void DisplayView() 
{ 
    MessageBox.Show("Hello"); 
} 

所有Caliburn.Micro樣品通過約定於x結合工作:名稱屬性,但如果我刪除文本=「{結合} 「它停止工作,所以我懷疑這種數據綁定方式不適用於子模型?

無論如何,殼牌的視圖模型是非常簡單的時刻:

ShellViewModel 
* AvailableScreens 
    -MdiViewModel1 
    -MdiViewModel2 
* CurrentActiveScreen 

任何想法我如何與Caliburn.Micro做到這一點? Rob Eisenberg在推特上向我建議,在進入完整的Caliburn框架之前,我可能想先與Caliburn.Micro開始。

回答

19

不幸的是,我們不能自動將慣例應用於DataTemplates的內容。原因是我們無法攔截WPF/Silverlight的模板創建機制。爲了解決這個問題,你有幾個選擇:

  1. 不要在DataTemplates中使用約定;使用顯式綁定和Message.Attach代替

  2. 將所有DataTemplates提取到UserControls中,這將重新遍歷UserControl中的約定。這是一個大的模板,小的

  3. 使用Bind.Model附加屬性的DataTemplate中的根UIElement這樣Bind.Model="{Binding}"一個好主意,但乏味。這樣做會導致約定與DataTemplate綁定。不幸的是,由於Caliburn中存在一些錯誤,這可能不太合適。它確實在Caliburn.Micro中工作。我希望儘快解決這個問題。