2013-03-22 99 views
2

我在我的父ViewModel中有一個ObservableCollection,我想要在父視圖中顯示。所以我定義了一個子視圖和一個子ViewModel處理按鈕的點擊。 如何從ObservableCollection中將每個項目放入相應的子ViewModel中,而不會丟失用於按鈕單擊處理的已設置的RelayCommands?WPF MVVM DataTemplate:從父視圖模型注入模板ViewModel

代碼隱藏我做的DataContext的是設置中選取適當的視圖模型的唯一的事我父視圖:

DataContext = new ParentViewModel(); 

在我父視圖XAML我定義了一個列表框,以顯示我的孩子查看一個DataTemplate:

<ListBox 
    ItemsSource="{Binding Path=Items}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate DataType="{x:Type vm:ChildViewModel}"> 
     <views:ChildView Width="auto" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

現在在我的ChildView我有幾個的TextBlocks顯示數據綁定和按鈕應該在的ObservableCollection中指定的路徑執行文件:

<TextBlock 
    Text="{Binding Path=Title}" /> 
... 
<Button 
    Content="Start exe" 
    Tag="{Binding Path=ExePath}"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Click"> 
     <i:InvokeCommandAction Command="{Binding Path=OnButtonClicked}" /> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

的兒童視圖模型持有RelayCommands處理按鈕單擊事件:現在

private RelayCommand onButtonClicked; 
public ICommand OnButtonClicked 
{ 
    get 
    { 
    return onButtonClicked ?? 
     (onButtonClicked = 
     new RelayCommand(ObeyOnButtonClicked, CanObeyOnButtonClicked)); 
    } 
} 
private void ObeyOnButtonClicked() 
{ 
    ... //Path conversion 
    Process.Start(pathToExe); 
} 
private bool CanObeyOnButtonClicked() 
{ 
    return true; 
} 

,我的孩子中查看的代碼隱藏,當我添加

DataContext = new SampleItemViewModel(); 

的構造,按鈕點擊處理,但文本框全部爲空。 當我刪除這一行時,文本框被正確填充,但不處理按鈕點擊。

如何讓這兩個功能都能正常工作?

編輯:

ParentViewModel:

private ObservableCollection<Item> items; 
public ObservableCollection<Item> Items 
{ 
    get { return items; } 
    set 
    { 
    items= value; 
    OnPropertyChanged("Items"); 
    } 
} 

... //Filling the Collection in Constructor 

ChildViewModel只包含上面提到的按鈕單擊處理。

編輯:

我試過幾件事情,但現在我不知道如何從ChildView命令綁定到我的ChildViewModel沒有設定我ChildView的DataContext的我ChildViewModel

回答

1

您可以刪除事件觸發器,因爲Button有一個Command屬性。

<TextBlock Text="{Binding Path=Title}" /> 
... 
<Button 
    Content="Start exe" 
    Tag="{Binding Path=ExePath}" 
    Command="{Binding Path=OnButtonClicked}" 
> 
</Button> 

,並設置的DataContext:

<ListBox 
    ItemsSource="{Binding Path=Items}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate DataType="{x:Type vm:ChildViewModel}"> 
     <views:ChildView Width="auto" DataContext="{Binding}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

但我怎麼處理的ChildViewModel與數據從收集項目按鈕點擊事件? – user2198982 2013-03-22 12:02:05

+0

請分享您的viewmodels的相關代碼 – mathieu 2013-03-22 12:04:05

+0

刪除您的DataContext = new SampleItemViewModel();從你的子視圖代碼後面,並按照mathieu指令 – blindmeis 2013-03-22 13:36:57