簡體   English   中英

更改ComboBox的值時更新TextBox文本

[英]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教程

解決了:

對我的代碼進行的最重要的更改是在為Product設置ProductCode之后觸發的RefreshDescription方法。 此方法將ProductCode作為參數,並查詢靜態ProductList以查找第一個匹配的Description。 如果需要,用戶可以更改自動填充的Description屬性。

我認為的代碼段:

<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.

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