2013-01-02 62 views
0

我有一個窗口的一部分應該顯示幾個用戶控件之一。每個UserControl只顯示不同的格式,排列和樣式的相同數據。將在窗口的該部分中呈現的特定UserControl應該由存儲在窗口的ViewModel中的單個設置來確定。如何在WPF窗口中的運行時間內爲另一個UserControl切換一個UserControl?

我該怎麼做才能使程序最終用戶可以在運行時更改窗口中顯示的UserControl?

+0

我不知道我是否理解你的問題,但如果我正確地讀它,只是谷歌衆多的教程之一在代碼中創建綁定,而比xaml。 – us2012

+0

我剛剛改變了這個問題的標題。也許這會幫助你理解我的問題。 –

回答

0

我想通了。在我的ViewModel中,我有一個名爲SelectedUCUserControl屬性,以及另一個名爲Style的屬性,它是enum類型,它列舉了我正在使用的不同的UserControls。在Style屬性我有OnPropertyChanged("SelectedUC");SelectedUC屬性的get部分的set部具有設置SelectedUC領域爲相應類型的UserControl的新實例並傳遞視圖模型(this)作爲一個開關case語句參數。

private MyStyleEnum _style = MyStyleEnum.OneStyle; 
public MyStyleEnum Style 
{ 
    get { return _style; } 
    set 
    { 
     if (value != _style) 
     { 
      _style = value; 
      OnPropertyChanged("Style"); 
      OnPropertyChanged("SelectedUC"); 
     } 
    } 
} 

private UserControl _selectedUC; 
public UserControl SelectedUC 
{ 
    get 
    { 
     switch (Style) 
     { 
      case MyStyleEnum.OneStyle: 
       _selectedUC = new ucOneControl(this); 
       break; 
      case MyStyleEnum.AnotherStyle: 
       _selectedUC = new ucAnotherControl(this); 
       break; 
     } 
     return _selectedUC; 
    } 
    set { _selectedUC = value; } 
} 

在我MainView的XAML中,我與Content屬性綁定到視圖模型的SelectedUC屬性ContentPresenter

<ContentPresenter Content="{Binding SelectedUC}" /> 

在我SettingsView的XAML中,我有一組RadioButton S中的所有綁定到Style屬性,並使用一個ConverterConverterParameter

<Window x:Class="MyProject.View.SettingsView" 
     xmlns:cv="clr-namespace:MyProject.Converters" 
     xmlns:vm="clr-namespace:MyProject.ViewModel"> 
<Window.Resources> 
    <cv:EnumToBoolConverter x:Key="EBConverter"/> 
</Window.Resources> 
<RadioButton Content="One" IsChecked="{Binding Path=Style, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=EBConverter}, ConverterParameter={x:Static Member=vm:MyStyleEnum.SingleLine}}"/>      
</Window> 

EnumToBoolConverter.cs:

public class EnumToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (parameter.Equals(value)) 
      return true; 
     else 
      return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return parameter; 
    } 
} 
0

一個(快,但不一定是最好的)方法是一個ContentControl中添加到您的窗口

<ContentControl Name="cc" /> 

然後設置,只要你喜歡它的內容。例如。將其設置在代碼隱藏

cc.Content = new UserControl1(); 
相關問題