我将此解决方案基于here提供的答案和其他阅读材料。我在App.xaml中有一个数据模板,用于将数据类型设置为我的viewmodel和相应的视图。在MainWindow.xaml中,我绑定到列表并使用此数据模板呈现ContentControl。最后,实际视图中有一个标签和一个文本框。
我理解MVVM很好,但是WPF实施它的方式对我来说是新的,而我只是无法将其连接起来。在视图的代码背后,DataContext在被实例化时为null。即使在视图代码的后面将DataContext显式设置为新的视图模型实例,也不会绑定这些属性。
App.xaml
<Application x:Class="MessagePublisher.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:MessagePublisher.UI.Components"
xmlns:viewModels="clr-namespace:MessagePublisher.ViewModels"
StartupUri="UI/MainWindow.xaml">
<Application.Resources>
<DataTemplate DataType="{x:Type viewModels:StringPropertyViewModel}">
<views:StringView />
</DataTemplate>
</Application.Resources>
</Application>
MainWindow.xaml
<Window x:Class="MessagePublisher.UI.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"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<ItemsControl ItemsSource="{Binding PropertyList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
var s = new CommonViewModel
{
TestList = new List<string>{"Test","List"},
PropertyList = new ObservableCollection<StringPropertyViewModel>
{
new StringPropertyViewModel
{
PropertyName = "Dog", Value = "Rascal"
},
new StringPropertyViewModel
{
PropertyName = "Cat", Value = "Mia"
}
}
};
InitializeComponent();
DataContext = s;
}
}
StringView.xaml
<UserControl x:Class="MessagePublisher.UI.Components.StringView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding PropertyName}"></Label>
<TextBox Grid.Column="1" Text="{Binding Value}"></TextBox>
</Grid>
</UserControl>
StringView.xaml.cs
public partial class StringView : UserControl
{
public StringView()
{
InitializeComponent();
}
}
StringPropertyViewModel
public class StringPropertyViewModel
{
public string PropertyName;
public string Value;
}
运行我的应用程序时,我看到了正确显示的StringView行数,但是数据绑定似乎无法正常工作,并且标签和文本框都为空。如果我用静态文本替换视图中的数据绑定,那将很好。没有异常,只是将渲染显示为空。
最终,我希望MainWindow有两行代表StringViews。第一行应有一个标签为“ Dog”的标签,文本框应为“ Ralph”。第二行应该有一个标签,上面写着“猫”,文本框中的值是“ Mia”。
我已经花了太多时间了。非常感谢您的协助!