2014-06-25 88 views
0

看起來像一個簡單的任務:我正在構建一個使用MVVM模式的wpf應用程序。我想要的是根據用戶輸入動態地改變視圖的一部分,使用不同的UserControls。WPF和MVVM:將UserControl動態綁定到XAML

比方說,我有2個用戶控件,一個用按鈕,另一個用標籤。 在主視圖中我有一個容器。繼XAML「作品」之後:

<GroupBox Header="container" > 
    <local:UserControlButton /> 
</GroupBox> 

和一個帶有按鈕的UserControl元素彈出。如果我將它改爲另一個,它也可以。 問題是如何動態地提供該groupbox。如果我把類似的東西在我的模型視圖:

private UserControl _myControl; 
public UserControl MyControl 
{ 
    get 
    { 
     return _myControl; 
    } 
    set 
    { 
     _myControl= value; 
     InvokePropertyChanged("MyControl"); 
    } 
} 

,改變我的觀點XAML喜歡的東西:

<GroupBox Header="container" > 
    <ItemsControl ItemsSource="{Binding MyControl}" /> 
</GroupBox> 

和命令用戶控件給它的按鈕或標籤:什麼也沒發生,雖然「MyControl」變量已設置,並且「調用屬性已更改」。

+1

[MVVMLight使用兩個視圖](http://www.codeproject.com/Articles/323187/MVVMLight-Using-Two-Views)有通讀。它解釋了基本概念。之後將其應用於您的案例應該很簡單。順便說一句,不知道你是什麼模型視圖。你的意思是'ViewModel'?如果是這樣的話,你首先不會在虛擬機中擁有UI元素。通讀鏈接的文章,也可能是前一篇文章,以幫助 – Viv

+1

請參閱我的回答[通過主窗口中包含的多個子視圖導航](http://stackoverflow.com/questions/23137371/navigating-through-multiple-在主窗口中包含子視圖/ 23137536#23137536)的問題。雖然它與您的示例並不完全相同,但您仍應該能夠通過遵循此處的建議來滿足您的要求。 – Sheridan

+0

@Sheridan +1我正準備鏈接到你的答案...... –

回答

1

很明顯,有很多方法可以爲這個特定的貓蒙皮 - 但要回答爲什麼它不起作用的問題,您需要查看ItemsSource ItemsControl屬性MSDN

項目控件旨在顯示多個項目,通過傳遞給ItemsSource屬性的IEnumerable提供。您正在傳遞一個UserControl,所以綁定將失敗。

對於您的示例,我會將ItemsControl更改爲ContentControl並將內容綁定到您的MyControl屬性。這應該工作。

<GroupBox Header="container" > 
    <ContentControl Content="{Binding MyControl}" /> 
</GroupBox> 

不過,我會強烈建議考慮這樣做的其他方式 - 在你的VM打破MVVM在我的腦海控制。根據你在做什麼看看數據模板 - 評論中@謝里登的鏈接提供了一個很好的描述。

0

無法張貼此作爲註釋因此增加爲答案..

看一看這樣的: Implementing an own "Factory" for reusing Views in WPF

它使用的DataTemplates但並不需要對每個視圖的DataTemplate部分。如果你可能有很多用戶控件/視圖要顯示,或者你正在通過多個視圖重用,或者你打算實際動態生成一個視圖(而不是加載一個現有的用戶控件),那麼這可能滿足你的需求。