簡體   English   中英

C#Wpf Combobox設置selectedValue,而不更改UI中的selecteditem

[英]C# Wpf Combobox set selectedvalue, not change selecteditem in UI

我在用戶控件中有一個組合框

 <ComboBox DisplayMemberPath="CustomerCollection.Description1" SelectedValuePath="CustomerCollection.CustomerID" 
                      SelectedValue="{Binding Order.OrderCollection.CustomerID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      ItemsSource="{Binding Customers, UpdateSourceTrigger=PropertyChanged}">
 </ComboBox>

我的視圖模型有一個類模型Order,它具有一個屬性CustomerID,在視圖模型中,我有一個observableCollection客戶

    private OrderModel _Order;
    public OrderModel Order
    {
        get
        {
            return _Order;
        }
        set
        {
            SetProperty(ref _Order, value);
        }
    }

    private ObservableCollection<CustomerModel> _Customers;
    public ObservableCollection<CustomerModel> Customers
    {
        get { return _Customers; }
        set { SetProperty(ref _Customers, value); }
    }

一切正常,但是當我設置Order.OrderCollection.CustomerID時,我的組合框的SelectedValue在ui中不會更新selecteditem

 private void ReloadCustomers(object CustomerID)
    {
        DialogVisibility = System.Windows.Visibility.Visible;

        BackgroundWorker bgwLoad = new BackgroundWorker();
        bgwLoad.DoWork += delegate (object s, DoWorkEventArgs args)
        {
            Customers = new ObservableCollection<CustomerModel>(_customerRepository.Get());
        };
        bgwLoad.RunWorkerCompleted += (sender, eventArgs) =>
        {
            Order.OrderCollection.CustomerID = (long)CustomerID;

            _eventAggregator.GetEvent<UIX_MessageEventAggregator.PassParameter>().Unsubscribe(ReloadCustomers);
        };
        bgwLoad.RunWorkerAsync();
    }

我嘗試在Customer內部實現equals的替代,但是stil無法正常工作,這是獲得工作的唯一方法,似乎在viewmodel內創建了一個customer屬性並綁定到selecteditem,但是我不喜歡

       public override bool Equals(object obj)
    {
        var customer = obj as CustomerModel;

        if (customer != null)
            return customer.CustomerCollection.CustomerID == CustomerCollection.CustomerID;
        else
            return false;
    }

    public override int GetHashCode()
    {
        return CustomerCollection.CustomerID.GetHashCode();
    }

我知道我錯過了一些東西,但是我不明白呢? 有人有主意嗎?

  public class OrderCollection : _CompanyModel
{
    public OrderCollection(string Vat) : base(Vat)
    {

    }

    #region Core
    private string _OrderID;
    public string OrderID
    {
        get { return _OrderID; }
        set { SetProperty(ref _OrderID, value); }
    }

    private long _CustomerID;
    public long CustomerID
    {
        get { return _CustomerID; }
        set { SetProperty(ref _CustomerID, value); }
    }
    #endregion
}

好的,問題是BackgroundWorker這項工作:

private void ReloadCustomers(object CustomerID)
{
   DialogVisibility = System.Windows.Visibility.Visible;

   Customers = new ObservableCollection<CustomerModel>(_customerRepository.Get());
   Order.OrderCollection.CustomerID = (long)CustomerID;
}

這不是:

private void ReloadCustomers(object CustomerID)
{
            DialogVisibility = System.Windows.Visibility.Visible;

            BackgroundWorker bgwLoad = new BackgroundWorker();
            bgwLoad.DoWork += delegate (object s, DoWorkEventArgs args)
            {
                Customers = new ObservableCollection<CustomerModel>(_customerRepository.Get());
            };
            bgwLoad.RunWorkerCompleted += (sender, eventArgs) =>
            {

                    Order.OrderCollection.CustomerID = (long)CustomerID;
                _eventAggregator.GetEvent<UIX_MessageEventAggregator.PassParameter>().Unsubscribe(ReloadCustomers);
            };
            bgwLoad.RunWorkerAsync();
        }

因為您沒有發布OrderCollection類的內容,所以這只是一個假設。 但是我最大的猜測是,在OrderCollection設置CustomerID屬性時,不會引發PropertyChangedEvent
因此,視圖永遠不會收到有關選擇更改的通知。

因此,即使您為CustomID更改模型實現以引發屬性更改,也可以解決此問題。
但是,您可能不希望通過此類事件來污染您的模型。 另一種選擇是將模型(客戶,訂單)包裝在專用的ViewModels中,並在需要的地方引發事件。

問題出在BackgroundWorker內部,我已經補充了

      await Task.Run(() =>
        {
            Customers = new ObservableCollection<CustomerModel>(_customerRepository.Get());
        })
        .ContinueWith(t =>
        {
            Order.OrderCollection.CustomerID = (long)CustomerID;
            _eventAggregator.GetEvent<UIX_GlobalEvent.PassParameter>().Unsubscribe(ReloadCustomers);
        });

暫無
暫無

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

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