2010-01-22 16 views
3

好吧,所以情況是我爲ResourceDictionary(Styles.xaml)中的ListBox定義了一個ItemTemplate。該ListBoxItem的模板看起來是這樣的:如何在ResourceDictionary(Styles.xaml)中將Silverlight ListItem DataTemplate中的按鈕與處理程序連接起來?

<ControlTemplate TargetType="ListBoxItem"> 
    <Button Command="{Binding Path=DoSomeCommand}" Content="Test" /> 
</ControlTemplate> 

現在只要使用這個模板,我想有這個按鈕的點擊綁定到一個可用的視圖模型的命令來處理它。

然而,這並不因爲是工作,我也嘗試過這樣的:

<ControlTemplate TargetType="ListBoxItem"> 
    <Button Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DoSomeCommand}" Content="Test" /> 
</ControlTemplate> 

,但仍然沒有骰子。

一個簡單的例子,做的工作是,如果你定義的控制(資源)的模板正在使用它,並且只使用一個事件處理程序(所有生成的XAML相同的處理程序。

任何意見或想法?在完成這一任務的最好方法我想這一定是一個常見的場景:我們的目標是隻允許用戶與在ListBox中的項目交互

感謝

回答

1

OK,我想我回答我自己的問題:

的解決方案似乎是使用「嵌套」的ViewModels這裏:

換句話說,而不是直接有我的列表框綁定到一個集合的DTOs /業務對象(正如我上面所做的那樣),我改爲創建一個簡單的ViewModel來包裝每個DTO,並且在上有命令,而不是在原始的頂級VM上。

所以邊界集合現在看起來是這樣的:

TestItems = new ObservableCollection<ItemVM>() 
    { 
     new ItemVM(), 
     new ItemVM(), 
     new ItemVM() 
    }; 

而且每個ItemVM只是包裝的DTO,並具有以下命令:

public class ItemVM : INotifyPropertyChanged 
{ 
    public ItemVM() 
    { 
     this.MyCommand = new DelegateCommand<string> (TheCommand); 
    } 

    public ICommand MyCommand { get; private set; } 
    public MyBusinessObject BizObj; 
} 

瞧,無需使用的RelativeSource和我們有一個可重複使用的模板和命令。

0

龍回答:!Reference to a TextBox inside a DataTemplate

簡短回答:使用棱鏡命令或混合行爲。

+0

感謝賈斯汀,但是我認爲在上面的代碼示例中非常清楚我使用的是Commands(實際上Commands現在內置於Silverlight框架中,不再需要使用Prism附加行爲)。 我認爲問題是每個ListItem的DataContext成爲數據綁定列表中的對象,而不是「頁面」ViewModel。這就是爲什麼我希望新的TemplatedParent RelativeSource可以提供幫助。 – Bobby 2010-01-23 09:19:33

相關問題