[英]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綁定到十進制屬性時似乎出現問題。 嘗試將“數量”類型更改為浮點數,看看是否可行。 更多內容:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.