我有一个ContentControl
Content
属性绑定到我的ViewModel中的UserControl
,就像我在这个问题中读到的那样:WPF: how do I load user controls dynamically?但是在尝试测试时,我的应用程序甚至没有运行,我得到一条消息,即Visual Studion XAML UI Designer出乎意料地崩溃,让我毫不知道这是怎么回事以及为什么会发生这种情况。
此外,在我的代码中,您可能会注意到我使用UserControl
代替FrameworkElement
,如上述问题中所建议的那样,我尝试了两种情况,但他们每个人都给了我同样的错误。
private UserControl _currentControl = new TableView();
EDIT2:上面的代码应该不是问题因为TableView是UserControl
,当我构建应用程序时我没有错误
与往常一样,我们将非常感谢您的帮助!
MainWindow.xaml
<Fluent:RibbonWindow x:Class="DatabaseExplorer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Fluent="clr-namespace:Fluent;assembly=Fluent"
xmlns:View="clr-namespace:DatabaseExplorer.Views"
xmlns:ignore="http://www.ignore.com"
mc:Ignorable="d ignore"
Height="300"
Width="300"
Title="Application"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Fluent:RibbonWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Fluent:RibbonWindow.Resources>
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Fluent:Ribbon>
...
</Fluent:Ribbon>
<ContentControl Grid.Row="1" Content="{Binding CurrentControl}" />
</Grid>
</Fluent:RibbonWindow>
MainViewModel.cs
...
/// <summary>
/// The <see cref="CurrentControl" /> property's name.
/// </summary>
public const string CurrentControlPropertyName = "CurrentControl";
private UserControl _currentControl = new TableView();
/// <summary>
/// Sets and gets the CurrentControl property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public UserControl CurrentControl
{
get
{
return _currentControl;
}
set
{
if (_currentControl == value)
{
return;
}
RaisePropertyChanging(CurrentControlPropertyName);
_currentControl = value;
RaisePropertyChanged(CurrentControlPropertyName);
}
}
...
答案 0 :(得分:1)
请不要调用您的MainViewModel类,并使用UserControl将代码放入其中!那不是MVVM方式:)
如果您想在MVVM中处理某种CurrentWorkspace,那么您应该使用Viewmodels和DataTemplates。所以改为将usercontrol设置为CurrentWorkspace - 只需设置一个viewmodel。
所有ContentControl Content属性需要一个Datatemplate来了解如何呈现视图模型。
MainViewModel.cs
public object CurrentWorkspace {get;set;}
...
this.CurrentWorkspace = this._myViewmodelInstanceWithSomeCoolThings;
xaml
<ContentControl Grid.Row="1" Content="{Binding CurrentWorkspace }" />
内容控件保持不变,但需要一个datatemplate来呈现您的viewmodel
xaml - resources
<Fluent:RibbonWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
<DataTemplate DataType="{x:Type local:ViewModelWithSomeCoolthingsClass}">
<local:MyViewForViewModelWithSomeCoolthingsClass />
</DataTemplate>
</ResourceDictionary>
</Fluent:RibbonWindow.Resources>