我有一個窗口的一部分應該顯示幾個用戶控件之一。每個UserControl只顯示不同的格式,排列和樣式的相同數據。將在窗口的該部分中呈現的特定UserControl應該由存儲在窗口的ViewModel中的單個設置來確定。如何在WPF窗口中的運行時間內爲另一個UserControl切換一個UserControl?
我該怎麼做才能使程序最終用戶可以在運行時更改窗口中顯示的UserControl?
我有一個窗口的一部分應該顯示幾個用戶控件之一。每個UserControl只顯示不同的格式,排列和樣式的相同數據。將在窗口的該部分中呈現的特定UserControl應該由存儲在窗口的ViewModel中的單個設置來確定。如何在WPF窗口中的運行時間內爲另一個UserControl切換一個UserControl?
我該怎麼做才能使程序最終用戶可以在運行時更改窗口中顯示的UserControl?
我想通了。在我的ViewModel中,我有一個名爲SelectedUC
的UserControl
屬性,以及另一個名爲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
屬性,並使用一個Converter
和ConverterParameter
。
<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;
}
}
一個(快,但不一定是最好的)方法是一個ContentControl中添加到您的窗口
<ContentControl Name="cc" />
然後設置,只要你喜歡它的內容。例如。將其設置在代碼隱藏
cc.Content = new UserControl1();
我不知道我是否理解你的問題,但如果我正確地讀它,只是谷歌衆多的教程之一在代碼中創建綁定,而比xaml。 – us2012
我剛剛改變了這個問題的標題。也許這會幫助你理解我的問題。 –