【问题标题】:Can't get text from textbox inside a listview无法从列表视图内的文本框中获取文本
【发布时间】:2013-08-10 13:47:58
【问题描述】:

XAML 代码:

<ListView.View>
    <GridView x:Name="myGridView">
        <GridViewColumn Width="0" DisplayMemberBinding="{Binding Id}">
            <GridViewColumnHeader Content="Id" IsHitTestVisible="False" />
        </GridViewColumn>
        <GridViewColumn Width="50" Header="Cant">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBox FontSize="11" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Width="300" Header="Nombre" DisplayMemberBinding="{Binding Nombre}" />
    </GridView>
</ListView.View>

用来自另一个列表视图的项目填充 myListView 的 C# 代码:

private void myListView_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent("myFormat"))
    {
        foreach (var item in e.Data.GetData("myFormat") as Dictionary<string, string>)
        {
            var itemC = new {Id = item.Key, Cant = "", Nombre = item.Value};
            myListView.Items.Add(itemC);
            myListView.SelectedItem = itemC;
        }
    }
}

从 myListView 检索项目的 C# 代码:

private Dictionary<string, string> GenerateArts()
{
    var arts = new Dictionary<string, string>();
    dynamic result = myListView.Items;

    foreach (var item in result)
       arts.Add((string) item.Id, (string) item.Cant);

    return arts;
}

myListView 填充后,用户可以在“Cant”列的每个文本框中写入数字,但稍后,当单击按钮并调用 GenerateArts() 时,这些数字会丢失,即 item.Cant 为“”(空string) 为每个项目。

有什么问题?

编辑:

当调用 GenerateArts() 时,item.Id 和 item.Nombre 的值如预期的那样存在。问题出在 item.Cant 上。

【问题讨论】:

    标签: c# wpf listview binding textbox


    【解决方案1】:

    您是否在 page_load 事件中使用 if(!IsPostBack)?也许你又要绑定数据了?

    【讨论】:

    • 谢谢马尔恰诺。我不知道 IsPostBack 是什么,但我现在会研究。
    • Marciano:这不是 Web 应用程序,而是桌面应用程序。
    【解决方案2】:

    Cant 绑定到TextBox.Text 属性,如下所示。

    XAML:

                <GridViewColumn Width="50" Header="Cant">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox FontSize="11" Text="{Binding Cant}" MinWidth="30"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
    

    更改背后的代码:

    var itemC = new MyData() { Id = item.Key, Cant = "", Nombre = item.Value };
    

    MyData 类

    public class MyData
    {
        public string Id { get; set; }
        public string Cant { get; set; }
        public string Nombre { get; set; }
    }
    

    【讨论】:

    • 谢谢阿南德。我之前尝试过,但是当来自另一个列表视图的项目被放到 myListView 上时,我得到(很多次)这个异常:TwoWay 或 OneWayToSource 绑定无法对类型为“f_AnonymousType2'3 的只读属性“Cant”起作用[系统字符串,系统字符串,系统字符串]'。即使我只拖放一个项目。
    • 正在运行您的代码,我也遇到了异常。与其创建具有属性的匿名类,不如自己定义类吗?
    • 是的,我可以。我会试试的。
    • 完美!非常感谢。 :) 我不能为我的声誉投票(这是我的第一个问题。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多