0

我有一个 ListView,它的表格中填写了我正在以编程方式创建和管理的 ListItemCollection。

我想检查哪些控件收到了任何类型的输入,目前我专注于任何类型的 TextInput。我不知道如何准确地找到该控件来自哪一列和哪一行(按名称或 ID,以最简单的为准)。

在通常的 Windows 窗体应用程序中,解决此问题的方法是以编程方式为每个控件分配一个唯一名称。用模板如[control name]_[row],如itemName_1

似乎无法修改由 ListItemCollection 生成的控件的名称。我还尝试使用 绑定控件Path="x",但是 XAML 阻止使用带有 name 属性的绑定标记。

这个问题有什么好的解决方案,我可以以某种方式检测与哪个确切的控件交互,而无需搜索所有控件?

这是我现在拥有的(在图片中只创建了一行): 在此处输入图像描述

4

1 回答 1

0

这里的问题是您以 WinForms 方式使用 WPF。它不应该那样使用,所以你最终会做错综复杂和虚假的事情。

这是你应该做的:

假设我们正在处理一个包含订单详细信息的订单。

我们首先创建类来保存我们的数据

public class Order : INotifyPropertyChanged
{
   private readonly ObservableCollection<OrderDetail> m_details = new ...

   public ObservableCollection<OrderDetail> Details { get { return m_details; } }

   public decimal Total {
     get {
       decimal total = 0.0;
       foreach(var detail in m_details) total += detail.SubTotal;
       return total;
     }
   }
}

public class OrderDetail : INotifyPropertyChanged
{
   private readonly Order m_order;

   public OrderDetail(Order order) {
     m_order = order;
   }       

   private string m_name;
   public string Name
   {
     get { return m_name; }
     set {
       if(m_name != value) {
         m_name = value;
         RaisePropertyChanged("Name");
       }
     }
   }
   private int m_amount;
   public int Amount {
     get { return m_amount; }
     set {
       if(m_amount != value) {
         m_amount = value;
         RaisePropertyChanged("Amount");
         RaisePropertyChanged("SubTotal");
         m_order.RaisePropertyChanged("Total");
       }
     }
   }
   private decimal m_unitPrice;
   public decimal UnitPrice {
     get { return m_amount; }
     set {
       if(m_unitPrice!= value) {
         m_unitPrice = value;
         RaisePropertyChanged("UnitPrice");
         RaisePropertyChanged("SubTotal");
         m_order.RaisePropertyChanged("Total");
       }
     }
   }
   public decimal SubTotal { get { return Amount * UnitPrice; } }
}

然后我们将创建一个视图来可视化和编辑我们的数据

...
<ListView ItemsSource="{Binding MyOrder}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <TextBox Text="{Binding Name}"/>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
      ...
    </GridView>
  </ListView.View>
</ListView>
<StackPanel Orientation="Horizontal">
  <TextBlock Text="Total: "/>
  <Textblock Text="{Binding MyOrder.Total}"/>
</StackPanel>
...
于 2013-01-15T11:52:35.593 回答