簡體   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