簡體   English   中英

具有可觀察集合的XAML Win8數據綁定TwoWay

[英]XAML Win8 Databinding TwoWay with an Observable Collection

我是Win8 App開發和XAML的新手(這是我的第一個有關堆棧溢出的文章,所以請輕描淡寫!)。

在我的項目中,我正在創建一個訂單頁面,該頁面顯示訂單標題詳細信息,然后顯示訂單行列表。 在訂單行上,我需要用戶能夠更新“數量”(這是我正在努力解決的問題)。

我創建了以下課程:

public class OrderDetails 
{

    public class OrderDetailsLine : INotifyPropertyChanged
    {
        public string ItemNo { get; set; }
        public string ItemDescription { get; set; }

        private decimal quantity;
        public decimal Quantity 
        { 
            get
            {
                return quantity;
            }

            set
            {
                quantity = value;
                OnPropertyChanged();
            }
        }


        public decimal Price { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string caller = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                   new PropertyChangedEventArgs(caller));
            }
        }
    }

    public class OrderDetailsHeader : INotifyPropertyChanged
    {
        public string OrderNo { get; set; }
        public string CustNo { get; set; }
        public string CustName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string County { get; set; }
        public string PostCode { get; set; }

        private string _externalDocNo;
        public string ExternalDocNo 
        { 
            get
            {
                return _externalDocNo;
            }
            set
            {
                _externalDocNo = value;
                OnPropertyChanged();
            }
        }

        public DateTime PostingDate { get; set; }

        private ObservableCollection<OrderDetailsLine> _Lines = new ObservableCollection<OrderDetailsLine>();
        public ObservableCollection<OrderDetailsLine> Lines
        {
            get
            {
                return this._Lines;
            }

            set
            {
                _Lines = value;
                OnPropertyChanged();
            }

        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string caller = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                   new PropertyChangedEventArgs(caller));

            }
        }
    }

在我的XAML代碼中,我有一個TextBox使用針對OrderDetails.OrderDetailHeader.ExternalDocNo的兩種方式的數據綁定。

但是我也有一個帶DataTemplate的ListView,其TextBox綁定到OrderDetails.OrderDetailHeader.Lines.Quantity

<ListView 
  HorizontalAlignment="Left"  
  Grid.Row="1" 
  VerticalAlignment="Top" 
  x:Name="ItemsListView"
  Margin="39,20,0,0"
  Width="Auto">
  <ListView.ItemTemplate>
      <DataTemplate>
          <Grid VerticalAlignment="Center" Width="800">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20*" />
                <ColumnDefinition Width="40*" />
                <ColumnDefinition Width="20*" />
                <ColumnDefinition Width="20*" />
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Margin="5" TextWrapping="NoWrap" 
                VerticalAlignment="Center"
                Text="{Binding ItemNo}" />

            <TextBlock Grid.Column="1" Margin="5" TextWrapping="Wrap"
                VerticalAlignment="Center"
                Text="{Binding ItemDescription}" />

            <TextBox Grid.Column="2" Margin="5" TextWrapping="NoWrap"
                HorizontalAlignment="Right"       
                VerticalAlignment="Center"
                Text="{Binding Quantity, Mode=TwoWay}" />

            <TextBlock Grid.Column="3" Margin="5" TextWrapping="NoWrap"
                HorizontalAlignment="Right"       
                VerticalAlignment="Center"
                Text="{Binding Price}" />


        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

ItemsSource的設置如下

   private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
   {    
      ...
      this.ExternalDoc.DataContext = orderDetails.orderDetailsHeader;
      this.ItemsListView.ItemsSource = orderDetails.orderDetailsHeader.Lines;

當我更改“文本框”中“數量”的值時,它不會調用PropertyChangedEventHandler-我不知道為什么不這樣做!

更改它時,ExternalDoc文本框更新良好

<TextBox x:Name="ExternalDoc" HorizontalAlignment="Left" Grid.Row="1" TextWrapping="Wrap"  VerticalAlignment="Top" Height="27" Width="223" Margin="39,160,0,0" Text="{Binding ExternalDocNo, Mode=TwoWay}"/>

任何幫助將不勝感激。 謝謝

我不完全了解您的問題,但是如果僅更改列表中一行的數量屬性,通常不會調用PropertyChangedEventHandler。 您將ObservableCollection的實例綁定到ListView的ItemSource屬性。 如果要提高Lines的PropertyChangedEventHandler屬性,則必須更改ObservableCollection的實例(以在setter上進行訪問)。 ObservableCollection允許WPF在列表中“觀察”修改。

我嘗試了您的示例代碼,但由於orderDetail,我不知道如何獲取orderDetailsHeader。 我嘗試以下代碼:

WpfApplication2.OrderDetails.OrderDetailsHeader header = new OrderDetails.OrderDetailsHeader(){
                Address = "tata",
                ExternalDocNo = "toto",
                Lines = new ObservableCollection<OrderDetails.OrderDetailsLine>()
            };
            header.Lines.Add(new OrderDetails.OrderDetailsLine()
            {
                ItemDescription = "toto",
                ItemNo = "titi",
                Price = 100,
                Quantity = 2
            });

            this.ExternalDoc.DataContext = header;
            this.ItemsListView.ItemsSource = header.Lines;

並使用此代碼和您的xaml,在更改數量和ExteranlNoDoc時會引發NotifyPropertyChangedEvent。

將Text綁定到十進制屬性時似乎出現問題。 嘗試將“數量”類型更改為浮點數,看看是否可行。 更多內容:

http://social.msdn.microsoft.com/Forums/windowsapps/en-US/b0bfe9b9-7634-40d2-8d81-c664498cae6a/winrt-xaml-binding-text-to-decimal-causes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM