【问题标题】:Access objects in Itemscontrol's ItemsSource访问 Itemscontrol 的 ItemsSource 中的对象
【发布时间】:2017-03-14 00:58:15
【问题描述】:

这是我的 ItemsControl

<ItemsControl Name="empanadas_ic" 
              ItemsSource="{Binding}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Columns="2"/>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Grid HorizontalAlignment="Right">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="25"/>
        </Grid.ColumnDefinitions>
        <Label Name="emp_nombre_lbl"
               Content="{Binding nombre}"
               Grid.Column="0"/>
        <TextBox Name="emp_cantidad_tb"
                 Grid.Column="1"
                 TextChanged="emp_cantidad_tb_TextChanged" />
      </Grid>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

这是 ItemsSource 绑定:

var context = new tres_empanadasEntities();
var v_empanadas = from t_empanadas in context.empanadas.ToList()
                  where t_empanadas.habilitado
                  select new{t_empanadas.id_empanada,
                             t_empanadas.nombre,
                             t_empanadas.precio};

this.empanadas_ic.ItemsSource = v_empanadas;

我实现了访问 del Label 和 TextBox,但没有访问 ItemsSource 中的项目:

int cant;
String nombre;
ContentPresenter c;

for (int i = 0; i < empanadas_ic.Items.Count; i++){
  c = (ContentPresenter)empanadas_ic.ItemContainerGenerator.ContainerFromItem(empanadas_ic.Items[i]);

  // LABEL ACCESS
  nombre = (c.ContentTemplate.FindName("emp_nombre_lbl", c) as Label).Content.ToString();

  // TEXTBOX ACCESS
  cant = Convert.ToInt32((c.ContentTemplate.FindName("emp_cantidad_tb", c) as TextBox).Text);


}

在同一个“for”循环中,我需要访问 ItemsSource 中的每个对象。

我知道 Items perperty 有这些项目,因为如果我打印

empanadas_ic.Items[i]

它向我展示了这样的东西:

{1, lalala, 123}

所以...我的对象在那里,但不能丰富它们。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您的ItemsSource 设置为匿名类型的IEnumerablehttps://msdn.microsoft.com/en-us/library/bb397696.aspx

    您可以使用dynamic 关键字来访问它的属性:

    for (int i = 0; i<empanadas_ic.Items.Count; i++)
    {
        dynamic obj = empanadas_ic.Items[i];
        var id_empanada = obj.id_empanada.ToString();
        var nombre = obj.nombre.ToString();
        //...
    }
    

    或者你可以创建一个类:

    public class YourClass
    {
        public string id_empanada { get; set; }
        public string nombre { get; set; }
        public string precio { get; set; }
    }
    

    ...将ItemsSource 设置为这种类型的IEnumerable

    var v_empanadas = from t_empanadas in context.empanadas.ToList()
                      where t_empanadas.habilitado
                      select new YourClass
                      {
                          id_empanada = t_empanadas.id_empanada,
                          nombre = t_empanadas.nombre,
                          precio = t_empanadas.precio
                      };
    

    ...和演员:

    for (int i = 0; i<empanadas_ic.Items.Count; i++)
    {
        YourClass obj = empanadas_ic.Items[i] as YourClass;
        if(obj != null)
        {
            var id_empanada = obj.id_empanada;
        }
        //...
    }
    

    当然,您应该将属性的类型更改为字符串,无论实体的真实类型是什么。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多