0

プログラムで作成および管理しているListItemCollectionがテーブルに入力されたListViewがあります。

どのコントロールがあらゆる種類の入力を受け取ったかを確認したいのですが、現在はあらゆる種類のTextInputに焦点を当てています。このコントロールがどの列と行からのものであるかを正確に見つける方法がわかりません(名前またはIDのどちらか簡単な方)。

通常のWindowsフォームアプリケーションでのこの問題の解決策は、プログラムで各コントロールに一意の名前を割り当てることです。[control name]_[row]などのテンプレートを使用しitemName_1ます。

ListItemCollectionによって生成されたコントロールの名前を変更することはできないようです。コントロールをでバインドしようとしましたがPath="x"、XAMLではnameプロパティでバインドタグを使用できません。

この問題の良い解決策は何ですか?すべてを検索しなくても、どの正確なコントロールが相互作用したかをどうにかして検出できますか?

これが私が今持っているものです(写真では1行だけが作成されました): ここに画像の説明を入力してください

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 に答える