【发布时间】:2012-02-06 21:27:05
【问题描述】:
我在 WPF ListView 中显示项目列表,这些项目具有数量、订单代码和描述。这些列绑定到视图模型中保存的 ObservableCollection 中的字段。这都是非常标准的,并且可以按预期工作。但是,在 ListView 的 Quantity 列中,我添加了两个按钮 + 和 -,其想法是当按下它们时,数量的值会增加或减少。问题是因为这些按钮没有绑定到 ObservableCollection 中的字段,所以我无法从列表视图中按下的按钮获取到 ObservableCollection 中记录的链接。我尝试在 ListView 中选择项目,但它是按下时被选中的按钮而不是 ListView 项目,我还捕获了按下按钮时鼠标指针下方的项目,但可以使用键盘按下它。
我觉得必须有一种(简单!)方法可以做到这一点,但我找不到。
这是 XAML:
<ListViewName="AccessoriesContent" >
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Select">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Name="QuantityStack">
<Button Name="SubtractAccessoryButton" Command="vx:DataCommands.SubtractAccessory" Content="-" />
<TextBox Name="QuantityTextBox" Text="{Binding Quantity, Mode=TwoWay}" />
<Button Name="AddAccessoryButton" Command="vx:DataCommands.AddAccessory" Content="+" />
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Order Code" DisplayMemberBinding="{Binding OrderCode}" />
<GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
背后的代码:
public MainWindow()
{
//CommandBindings.Add(
InitializeComponent();
AccessoryVM = new AccessoryViewModel();
AccessoriesContent.ItemsSource = AccessoryVM.AccessoryCollection;
}
还有 ViewModel:
class AccessoryViewModel
{
ObservableCollection<AccessoryData> _AccessoryCollection =
new ObservableCollection<AccessoryData>();
public ObservableCollection<AccessoryData> AccessoryCollection
{ get { return _AccessoryCollection; } }
public void PopulateAccessories(string order_code)
{
// Read the data and populate AccessoryCollection
}
}
public class AccessoryData : INotifyPropertyChanged
{
private int _quantity;
public int Quantity
{
get { return _quantity; }
set
{
this._quantity = value;
Notify("Quantity");
}
}
public string OrderCode { get; set; }
public string Description { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string propName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
除此之外,我还有两个由按钮触发的方法 SubtractAccessory 和 AddAccessory,但我还没有用任何可行的方法填充它们。
【问题讨论】: