Caliburn.Micro, SelectedItem не срабатывает в EditableCombobox при вводе несуществующего элемента - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь установить метод CanExecute, как только пользователь вводит информацию в ComboBox со связанным списком элементов. Я могу отключить кнопку с помощью CanAddCustomer (имя AddCustomer) без проблем, когда выбран существующий элемент; Отключение кнопки также работает, когда поле ввода пустое (selectedCustomer имеет значение null); но эти события, похоже, не захватывают свободный ввод в поле ввода

Empty, Disabled

Existing customer, Disabled

Несуществующий элемент, следует включить

  1. Отключено, потому что пусто,
  2. Отключено, потому что существующий клиент
  3. Должно быть включено, потому что не существует записи

WPF для поля со списком

<ComboBox 
    x:Name="Customers" Height="40"
    DisplayMemberPath="CustomerName"
    Controls:TextBoxHelper.UseFloatingWatermark="False"
    Controls:TextBoxHelper.Watermark="Select a Customer"
    IsEditable="True"
    MaxDropDownHeight="125"
    Margin="0 0 15 0"
    Grid.Column="0" 
/>

Данные в ViewModel:

private Customer _selectedCustomer ;
private string _customer;

public string Customer
{
    get { return _customer; }
    set {
        _customer = value;
        NotifyOfPropertyChange(() => CanAddCustomer);
    }
} 


public Customer SelectedCustomer 
{
    get { return _selectedCustomer; }
    set {
        _selectedCustomer = value;
        NotifyOfPropertyChange(() => CanAddCustomer);
        GetAllOrdersPerCustomer();
    }
}


public bool CanAddCustomer
{
    get
    {
        Customer cs = SelectedCustomer;
        if (cs == null && string.IsNullOrEmpty(Customer))
        {
            return false;
        } else if (cs != null ) {
            return false;
        } else
        {
            return true;
        }
    }

} 

public void AddCustomer()
{
    Debug.WriteLine("You cliked");
}

проблема известна мне, когда я отлаживаю проект, я вижу, что «SelectedCustomer» не срабатывает ... но ... как мне тогда ссылаться на текст в текстовом поле? Свойство public string Customer было моей попыткой, но это только значение selectedItem

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вам необходимо установить свойство Text в ComboBox, а затем привязать его к своему свойству.

 <ComboBox 
     x:Name="Customers" Height="40"
     Text="{Binding Customer, Mode=TwoWay}"
     DisplayMemberPath="CustomerName"
     Controls:TextBoxHelper.UseFloatingWatermark="False"
     Controls:TextBoxHelper.Watermark="Select a Customer"
     IsEditable="True"
     MaxDropDownHeight="125"
     Margin="0 0 15 0"
     Grid.Column="0" 
 />

1 голос
/ 07 августа 2020

Элемент управления ComboBox устанавливает для своего свойства SelectedItem значение null, когда вы вводите значение, которого нет в его ItemsSource.

Вы реализовали свою модель представления, чтобы действительно включить ComboBox, когда SelectedItem имеет значение null, а ComboBox пусто.

Возможно, вам лучше привязать к свойству Text свойства ComboBox в этом случае. Он должен возвращать все, что в настоящее время находится в TextBox.

Свойство SelectedItem может быть установлено только на значение, которое находится в ItemsSource.

...