繁体   English   中英

WPF MVVM数据绑定问题

[英]WPF MVVM Data Binding issue

我的ViewModel如下:

public class ShipDataCollectViewModel : ViewModelBase
{
    //private ObservableCollection<Item> _scannedItems;
    //private Item _scanningItem;

    public ObservableCollection<Item> ScannedItems
    {
        get;
        private set;
    }
    public Item ScanningItem 
    {
        get;
        private set;
    }
    public ShipDataCollectViewModel()
    {
        ScannedItems = new ObservableCollection<Item>();
        ScanningItem = new Item();
        AddItemCommand = new RelayCommand(AddItem, CanAddItem);
    }

    private RelayCommand _addItemCommand;

    public RelayCommand AddItemCommand { get; private set; }

    private void AddItem()
    {
        //var item = new Item { ItemNo = _scanningItem.ItemNo, Qty = _scanningItem.Qty, Box = _scanningItem.Box, SerialNo = _scanningItem.SerialNo };
        //ScannedItems.Add(item);
        //Cannot use the following code, it will overwrite all the ObservableCollection's items if exist.
        ScannedItems.Add(ScanningItem);
    }

    private bool CanAddItem()
    {
        return true;
    }

}

View如下:

<Grid>
    <Grid HorizontalAlignment="Left" Height="114" Margin="10,10,0,0" VerticalAlignment="Top" Width="722">
        <Label Content="Customer No:" HorizontalAlignment="Left" Height="27" Margin="5,5,0,0" VerticalAlignment="Top" Width="94"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="104,5,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="108"/>
        <Label Content="PO No:" HorizontalAlignment="Left" Height="27" Margin="258,5,0,0" VerticalAlignment="Top" Width="94"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="354,5,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="108"/>
        <Label Content="SO No:" HorizontalAlignment="Left" Height="27" Margin="5,40,0,0" VerticalAlignment="Top" Width="94"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="104,40,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="108"/>
        <Label Content="Vendor:" HorizontalAlignment="Left" Height="27" Margin="255,40,0,0" VerticalAlignment="Top" Width="94"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="354,40,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="108"/>
        <Label Content="Invoice No:" HorizontalAlignment="Left" Height="27" Margin="5,72,0,0" VerticalAlignment="Top" Width="94"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="104,72,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="108"/>
    </Grid>
    <Grid HorizontalAlignment="Left" Height="221" Margin="10,127,0,0" VerticalAlignment="Top" Width="722">
        <Label Content="Shipping Detail" HorizontalAlignment="Left" Height="27" Margin="10,10,0,0" VerticalAlignment="Top" Width="207" FontWeight="Bold"/>
        <Label Content="Item:" HorizontalAlignment="Left" Height="27" Margin="10,42,0,0" VerticalAlignment="Top" Width="57"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="79,42,0,0" TextWrapping="Wrap" Text="{Binding ScanningItem.ItemNo}" VerticalAlignment="Top" Width="210"/>
        <Label Content="Qty:" HorizontalAlignment="Left" Height="27" Margin="10,76,0,0" VerticalAlignment="Top" Width="57"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="79,76,0,0" TextWrapping="Wrap" Text="{Binding ScanningItem.Qty}" VerticalAlignment="Top" Width="89"/>
        <Label Content="Box:" HorizontalAlignment="Left" Height="27" Margin="10,109,0,0" VerticalAlignment="Top" Width="57"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="79,109,0,0" TextWrapping="Wrap" Text="{Binding ScanningItem.Box}" VerticalAlignment="Top" Width="210"/>
        <Label Content="Serial No:" HorizontalAlignment="Left" Height="27" Margin="10,142,0,0" VerticalAlignment="Top" Width="64"/>
        <TextBox HorizontalAlignment="Left" Height="27" Margin="79,142,0,0" TextWrapping="Wrap" Text="{Binding ScanningItem.SerialNo}" VerticalAlignment="Top" Width="210"/>
        <CheckBox Content="Item LookUp" HorizontalAlignment="Left" Margin="310,42,0,0" VerticalAlignment="Top" Width="153.42"/>
        <Button Content="Add" HorizontalAlignment="Left" Margin="310,142,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
    <Grid HorizontalAlignment="Left" Height="339" Margin="19,353,0,0" VerticalAlignment="Top" Width="723">
        <Label Content="Scanned Items" HorizontalAlignment="Left" Height="27" Margin="10,10,0,0" VerticalAlignment="Top" Width="207" FontWeight="Bold"/>
        <DataGrid HorizontalAlignment="Left" Margin="10,42,0,0" VerticalAlignment="Top" 
                  Height="260" Width="535" AutoGenerateColumns="False" ItemsSource="{Binding ScannedItems}"
                  Style="{StaticResource AzureDataGrid}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding ItemNo}"  Header="ItemNo"/>
                <DataGridTextColumn Binding="{Binding Qty}" Header="Qty"/>
                <DataGridTextColumn Binding="{Binding Box}" Header="Box"/>
                <DataGridTextColumn Binding="{Binding SerialNo}" Header="SerialNo"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Delete Selected" HorizontalAlignment="Left" Height="24" Margin="10,307,0,0" VerticalAlignment="Top" Width="141"/>
    </Grid>
    <Button Content="Exit" HorizontalAlignment="Left" Height="23" Margin="28,307,0,0" VerticalAlignment="Top" Width="151"/>
    <Button Content="Send File" HorizontalAlignment="Left" Height="23" Margin="276,307,0,0" VerticalAlignment="Top" Width="151"/>
</Grid>

视图类如下:

public partial class ShipDataCollect : MetroWindow
{
    private ShipDataCollectViewModel viewModel;

    public ShipDataCollect()
    {
        InitializeComponent();
        viewModel = new ShipDataCollectViewModel();
        DataContext = viewModel;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        viewModel.AddItemCommand.Execute(null);
    }
}

目的:

  • 添加项目,并将其显示在DataGrid视图中。 但是出现了以下问题。
  • 添加第一个Item-> Item A {Item A,10,Box1,SerialNo1},它将正确显示在DataGrid
  • 添加第二项->项B {项B,10,Box2,SerialNo2}。 单击添加按钮后,两个项目将显示在数据网格中,但它们都是项目B。

试图多次添加同一当前项目( ScanningItem )实例。 在将上一个项目添加到集合后,考虑创建一个新项目:

private void AddItem()
{
    ScannedItems.Add(ScanningItem);
    ScanningItem = new Item();
}

当更改ScanningItem属性的值以将更改传播到View (数据绑定机制)时,请介绍PropertyChanged事件的触发。 例如,将ScanningItem从自动实现属性转换为具有后备字段的属性,如下所示(假定使用了MVVM Light):

private Item scanningItem;
public Item ScanningItem
{
    get
    {
        return scanningItem;
    }

    private set
    {
        if (Equals(scanningItem, value))
        {
            return;
        }

        scanningItem = value;
        RaisePropertyChanged("ScanningItem");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM