wpf中的列表框和observablecollection

时间:2014-01-04 16:30:05

标签: c# wpf listbox observablecollection

我有listBox显示发票项目:

        <ListBox x:Name="lbInvoice" ItemsSource="{Binding ocItemsinInvoice}"  Margin="10,27,0,143" Width="412" HorizontalAlignment="Left" BorderBrush="{x:Null}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <ToggleButton x:Name="btnInvoiceItem" Checked="btnInvoiceItem_Checked" Style="{StaticResource InvoiceBG}" TabIndex="{Binding ItemsinInvoiceID}" Padding="20,0,0,0" FontSize="12" Width="408" Height="35" Foreground="#FFcfcfcf" IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" BorderThickness="1,0.5">
                        <ToggleButton.BorderBrush>
                            <SolidColorBrush Color="#FF5B616F" Opacity="0.7"/>
                        </ToggleButton.BorderBrush>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Item.ItemName}" Width="200"/>
                            <TextBlock Text="{Binding SalePrice}" Width="50"/>
                            <TextBlock Text="{Binding Quantity,NotifyOnSourceUpdated=True}" Width="50"/>
                            <TextBlock Text="{Binding Total}" Width="50"/>
                        </StackPanel>
                    </ToggleButton>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

问题是当我更改后面的代码中的数量值时(例如,单击事件)

ItemsinInvoice _lbi = (ItemsinInvoice)lbInvoice.SelectedItem;
_lbi.Quantity = 99; //for example

在屏幕上列表中的数量值不会改变,我是否错过任何事情。

由于

1 个答案:

答案 0 :(得分:1)

如果您希望对ViewModel的更改自动反映在视图中,那么您的类需要实现INotifyPropertyChanged,并且每次属性更改值时都需要引发PropertyChanged事件:

public class ItemsinInvoice : INotifyPropertyChanged
{
    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

    private int _quantity;

    public int Quantity
    {
        get { return _quantity; }
        set
        {
            if (_quantity != value)
            {
                _quantity = value;
                OnPropertyChanged("Quantity");
            }
        }
    }
}

<强>更新

  

我不知道如何使用这段代码,你能解释一下吗?

这是非常简单的代码,但会尝试为您分解。首先,您需要实现INotifyPropertyChanged接口

public class ItemsinInvoice : INotifyPropertyChanged

此界面有一个PropertyChanged事件,您需要在班级中发布

public event PropertyChangedEventHandler PropertyChanged;

然后你编写了helper方法来为指定的属性名称安全地引发这个事件:

private void OnPropertyChanged(string propertyName)
{
   ...
}

并且INotifyPropertyChanged已实施。现在,您需要在每次属性更改值时使用属性名称调用上面的OnPropertyChanged(...)方法,因此在public int Quantity { ... }的示例中,您的调用看起来像OnPropertyChanged("Quantity"),并且您必须记住它区分大小写所以属性名称必须完全匹配。
通过实现INotifyPropertyChanged接口并为属性名称引发PropertyChanged事件,您告诉绑定具有此名称的属性更改其值,并且所有相关绑定都需要刷新。