简体   繁体   English

WPF MVVM数据绑定问题

[英]WPF MVVM Data Binding issue

My ViewModel is as follows: 我的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 is as follows: 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>

View Class is as follows: 视图类如下:

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);
    }
}

Purpose: 目的:

  • Add Item, and display it in the DataGrid View. 添加项目,并将其显示在DataGrid视图中。 but got the following Problem. 但是出现了以下问题。
  • Add first Item ->Item A {Item A, 10, Box1, SerialNo1}, it will display correctly in DataGrid . 添加第一个Item-> Item A {Item A,10,Box1,SerialNo1},它将正确显示在DataGrid
  • Add Second Item-> Item B {Item B, 10, Box2, SerialNo2}. 添加第二项->项B {项B,10,Box2,SerialNo2}。 after click Add button, two items will be displayed in the Data Grid, but both of them are Item B. 单击添加按钮后,两个项目将显示在数据网格中,但它们都是项目B。

There is an attempt to add the same current item ( ScanningItem ) instance multiple times. 试图多次添加同一当前项目( ScanningItem )实例。 Consider creating a new item after adding the previous one to the collection: 在将上一个项目添加到集合后,考虑创建一个新项目:

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

Please introduce firing of PropertyChanged event when the value of ScanningItem property is changed to propagate changes to View (data binding mechanism). 当更改ScanningItem属性的值以将更改传播到View (数据绑定机制)时,请介绍PropertyChanged事件的触发。 For example, convert ScanningItem from auto-implement property to property with backing field as follows (assuming that MVVM Light is used): 例如,将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