XAML:Simple ItemsControl绑定到TextBox不起作用:如何设置源属性?

时间:2017-04-08 03:40:05

标签: c# wpf xaml binding itemscontrol

我有一个ObservableCollection,我尝试绑定到文本框列表。文本框确实显示但文本内容不显示。

XAML:

<Grid>
    <Grid.RowDefinitions >
        <RowDefinition />
    </Grid.RowDefinitions>
    <ItemsControl ItemsSource="{Binding Path=ListOfMessages}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Path=Message, ElementName=ListOfMessages}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

守则:

在ViewModel中:

public ObservableCollection<ApplicationLog> ListOfMessages { get; set; }

在模型中:

public class ApplicationLog 
{
    public string Code { get; set; }
    public string Message { get; set; }
}

当我运行它时,应用程序显示文本框(例如4个文本框,一个在另一个下面),但文本框中的文本(即Message属性)未显示。我认为文本框的Binding表达式是错误的。

上下文:我是XAML和WPF的新手。更一般地说:如何调试绑定问题与此类似。

感谢。

1 个答案:

答案 0 :(得分:1)

删除ElementName=ListOfMessages。每个项目的DataContext将是ListOfMessages中与ItemsSource绑定的项目。

<Grid>
    <Grid.RowDefinitions >
        <RowDefinition />
    </Grid.RowDefinitions>
    <ItemsControl ItemsSource="{Binding Path=ListOfMessages}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <!-- DataContext will be ListOfMessages[0], [1], ..., [n] -->
                <TextBox Text="{Binding Path=Message}" /> 
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

ElementName用于绕过DataContext并指向作用域XAML中的特定命名项。