我有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
在屏幕上列表中的数量值不会改变,我是否错过任何事情。
由于
答案 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
事件,您告诉绑定具有此名称的属性更改其值,并且所有相关绑定都需要刷新。