【问题标题】:Binding a string list to a DataGridTemplateColumn TextBox将字符串列表绑定到 DataGridTemplateColumn 文本框
【发布时间】:2017-05-10 12:35:08
【问题描述】:

如果我尝试这样做,我会得到“System.Windows.Markup.XamlParseException”。

我的 XAML 代码如下所示:

<Window x:Class="WpfApplication1.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="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding ErrorLog}" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False">
            <DataGrid.Columns>
                <!-- This is working -->
                <DataGridTextColumn Binding="{Binding}" Header="Fehler" Width="*"/>

                <!-- This is not working -->
                <DataGridTemplateColumn Header="">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding}" AcceptsReturn="True" AcceptsTab="True" TextWrapping="Wrap"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

我的代码背后的代码如下所示:

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public ObservableCollection<string> ErrorLog { get; set; } = new ObservableCollection<string>()
        {
            "A",
            "B"
        };
    }
}

【问题讨论】:

  • 不确定,但您可能缺少绑定的相关来源?可以试一试吗?

标签: c# .net wpf xaml data-binding


【解决方案1】:

来自异常的其他信息是:双向绑定需要 Path 或 XPath。 TextBox Text 属性默认具有 TwoWay 绑定模式。 TwoWay 绑定不接受像"{Binding}" 这样的空绑定。请尝试以下操作。

<DataGridTemplateColumn Header="">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=.}" AcceptsReturn="True" AcceptsTab="True" TextWrapping="Wrap"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我认为,更改您的集合类型并使用一些自定义类型而不是字符串将是一个更好的解决方案: XAML:

<Grid>
    <DataGrid ItemsSource="{Binding ErrorLog}" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Message}" Header="Fehler" Width="*"/>
            <DataGridTemplateColumn Header="">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Message}" AcceptsReturn="True" AcceptsTab="True" TextWrapping="Wrap"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
}

public class MainViewModel
{
    public ObservableCollection<Error> ErrorLog { get; set; } = new ObservableCollection<Error>
                                                                    {
                                                                        new Error("A"),
                                                                        new Error("B"),
                                                                    };
}

public class Error
{
    public Error(string message)
    {
        Message = message;
    }

    public string Message { get; set; }
}

如果需要,还可以考虑实现 INotifyPropertyChanged 接口,以便能够从视图模型更改消息。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2012-04-20
    • 1970-01-01
    • 2015-06-14
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多