Я отображаю список элементов в WPF ListView, элементы имеют количество, код заказа и описание. Столбцы привязываются к полям в ObservableCollection, хранящемся в модели представления. Это все очень стандартно и работает как и ожидалось. Однако в столбце «Количество» в ListView я добавляю две кнопки «+» и «-», идея состоит в том, что при нажатии значение величины либо увеличивается, либо уменьшается. Проблема состоит в том, что, поскольку эти кнопки не привязаны к полю в 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, которые запускаются кнопками, но мне еще предстоит заполнить их всем, что будет работать.