[英]Update TextBox text when a ComboBox's value is changed
我的應用程序:商店有一個Products集合和一個int Id屬性。 Product具有字符串ProductCode和Description屬性。 ViewModel引用Store的單個實例。 ViewModel有一個靜態的Products(ProductList)集合。 My View的DataContext設置為ViewModel。 我的視圖通過ViewModel顯示Store。
什么有效:我的視圖有一個綁定到商店ID的TextBlock。
什么不起作用: My View有一個DataGrid,用於將商品添加到商店的產品系列。 用於將Products添加到Store的Products集合的DataGrid允許我使用DataGridComboBoxColumn列選擇新的ProductCode。 這很好用。 但是,我希望我選擇的ProductCode更新綁定到產品描述的DataGridTextBoxColumn。
我花了好幾個小時搜索網絡,但我沒有找到任何與我的場景完全匹配的東西,除了這個鏈接中的“例12”,但我沒有讓它為我的項目工作: 最好的ComboBox教程
我認為的代碼段:
<StackPanel>
<TextBlock Text="{Binding Store.Id}"/>
<DataGrid ItemsSource="{Binding Store.Products}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn
Header="ProductCode"
ItemsSource="{x:Static m:ItemsProvider.ProductList}"
SelectedValueBinding="{Binding ProductCode, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="ProductCode"
DisplayMemberPath="ProductCode"/>
<!--
I want Description for my chosen Product to pop in automatically... but how?
-->
<DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
我的ViewModel:
public class ViewModel : NotifyObject
{
// Constructor
public ViewModel()
{
_store = new Store() { Id = 1 };
}
// Fields
Store _store;
Product _selectedProduct;
// Properties
public Store Store {
get { return _store; }
set {
_store = value;
base.NotifyPropertyChanged("Commission");
}
}
}
我的產品型號:
public class Product : NotifyObject
{
// Constructor
public Product() { }
// Fields
string _productCode;
string _description;
// Properties
public string ProductCode {
get { return _productCode; }
set {
_productCode = value;
base.NotifyPropertyChanged("ProductCode");
RefreshDescription(ProductCode);
}
}
public string Description {
get { return _description; }
set {
_description = value;
base.NotifyPropertyChanged("Description");
}
}
// Private Methods
void RefreshDescription(string productCode)
{
if (ItemsProvider.ProductList.Count == 0) {
return;
}
Product product = ItemsProvider.ProductList.FirstOrDefault(p => p.ProductCode == productCode);
this.Description = (product == null ? "" : product.Description);
}
}
我的商店型號:
public class Store : NotifyObject
{
// Constructor
public Store()
{
Products = new ObservableCollection<Product>();
}
// Fields
int _id;
// Properties
public int Id {
get { return _id; }
set {
_id = value;
base.NotifyPropertyChanged("Id");
}
}
public ObservableCollection<Product> Products { get; set; }
}
我的靜態類,用於獲取可供選擇的產品列表:
public static class ItemsProvider
{
static ObservableCollection<Product> _productList = new ObservableCollection<Product>();
static ItemsProvider()
{
_productList = new ObservableCollection<Product>() {
new Product() { ProductCode = "111", Description = "a" },
new Product() { ProductCode = "222", Description = "b" },
new Product() { ProductCode = "333", Description = "c" },
new Product() { ProductCode = "444", Description = "d" }
};
}
public static ObservableCollection<Product> ProductList {
get {
return _productList;
}
}
}
一種簡單的方法是在產品代碼更改時引發PropertyChanged
,然后執行查找以獲取描述:
// Properties
public string ProductCode {
get { return _productCode; }
set {
_productCode = value;
base.NotifyPropertyChanged("ProductCode");
base.NotifyPropertyChanged("Description");
}
}
public string Description {
get {
var matchingProduct = ViewModel.ProductList.FirstOrDefault(product => product.ProductCode == ProductCode);
return (matchingProduct == null ? "" : matchingProduct.Description);
}
}
可能更好的方法是為您的ProductList和Products集合定義不同的類。 前者應為ProductType (包含產品代碼和描述),后者應為ProductInstance (僅包含產品代碼)。 然后,您可以使用類似上面的內容來定義后一類的只讀產品描述。
從我編輯的問題:
對我的代碼進行的最重要的更改是在為Product設置ProductCode之后觸發的RefreshDescription方法。 此方法將ProductCode作為參數,並查詢靜態ProductList以查找第一個匹配的Description。 如果需要,用戶可以更改自動填充的Description屬性。
再次感謝那些幫助我得出這個結論的人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.