2015-02-18 2 views
0

У меня есть ListBox;Как обновить LisBox ItemSource On Button Нажмите

<ListBox Grid.Row="1" Grid.ColumnSpan="2" 
       x:Name="customerListBox" 
       ItemsSource="{Binding Customers}" 
       DisplayMemberPath="Customername" 
       SelectionMode="Single" Width="200"/> 

Клиенты является public ObservableCollection<Customer> Customers { get; private set; }

Теперь я связывании ListBox Selected Item в текстовом поле:

<TextBox Text="{Binding ElementName=customerListBox, 
Path=SelectedValue.Customername,Mode=OneWay}"/> 

Я сделал это в одну сторону, как там я хочу, чтобы зафиксировать изменения только нажмите кнопку «Сохранить», а не когда значение изменится на TextBlock.

<Button Content="Save" Grid.Column="0" Grid.Row="3" Width="80" Height="30" 
          Command="{Binding SaveCommand}" 
+0

показать код команды здесь? ... как его одностороннее связывание, как вы сопоставляете его с вашим источником? – Muds

+0

@Muds Я хочу обновить ItemsSource = "{Binding Customers}" на SaveCommand, ничего не делая там сейчас – Simsons

+0

Если вы не нажмете свои изменения на свой объект, вы не сможете получить их в своем объекте, потому что нет привязки поддержки ... до то его просто textbox.text – Muds

ответ

2

Вы идете не так, об этом, имхо.

Не связывайте TextBox непосредственно с выбранным товаром. Скорее создайте новую команду, SelectionChangedCommand, и новое свойство, CurrentlyActiveText, привяжите его к TextBox.

Логика была бы проста:

SelectionChangedCommand = new RelayCommand(selectedItem=> { 
    // todo: ask user if he wants to commit the previous changes?! 
    CurrentlyActiveText = (string)selectedItem; 
}) 

SaveCommand = new RelayCommand(() => { 
    yourObservable[SelectedIndex] = CurrentlyActiveText; 
}); 
0

Может быть, лучше способ сделать это с помощью триггеров сгореть команды на события ListBox SelectionChanged. Ввод логики в собственность сеттер всегда чувствует себя немного неправильно мне

<ListBox...> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding CustomerListBoxSelectionChanged}" CommandParameter="{Binding ElementName=customerListBox,Path=SelectedItem}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

В вашей модели представления:

public Customer CurrentCustomer { get; set; } 

public RelayCommand<Customer> CustomerListBoxSelectionChanged { get; set; } 

private void OnCustomerListBoxSelectionChanged(Customer customer) 
{ 
    CurrentCustomer = customer; 
    NewCustomerName = customer.CustomerName; 
} 

private string _newCustomerName; 

public string NewCustomerName 
{ 
    get { return _newCustomerName; } 
    set 
    { 
     if (_newCustomerName == value) 
      return; 

     _newCustomerName = value; 
     RaisePropertyChanged("NewCustomerName"); 
    } 
} 

Ваш TextBox в вашем XAML становится:

<TextBox Text="{Binding NewCustomerName}"/> 

И, наконец, , ваш SaveCommand называет метод, который просто делает ...

private void OnSave() 
{ 
    CurrentCustomer.CustomerName = NewCustomerName; 
} 

Примечание Вы также должны убедиться, что ваш CustomerName в вашем объекте клиента поднимает события PropertyChanged для того, чтобы отразить обновление в вашем ListBox

Обратите внимание, что делает это таким образом, также экономит вам futher выполните поиск ObservableCollection для выполнения обновления. Это сэкономит вам некоторое время - любое увеличение производительности всегда хорошее :)

Смежные вопросы