为什么我的UserControl的数据模板未绑定到ContentControl的数据上下文?

时间:2019-07-06 18:08:34

标签: c# wpf xaml mvvm data-binding

我将此解决方案基于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”。

我已经花了太多时间了。非常感谢您的协助!

0 个答案:

没有答案