2014-06-16 40 views
0

我有一个ListBox绑定到ObservableCollection。每当我按下列表框项目时,我都可以在我设计的右侧面板上看到信息。我这样做,通过Binding所选项目到每个TextBox这样的:如何保存数据后按钮点击绑定列表框

<TextBox Name="TextBoxEditName" Text="{Binding ElementName=ListBoxClients, Path=SelectedItem.Name}" /> 

哪里ListBoxClients是包含ObservableCollection数据我ListBox对象,并在这一特定TextBox我展示它的Name

注:该部分工作正常。如果我在列表中选择另一个项目,它会更改。

现在来了棘手的部分: 每当我编辑TextBoxListBox项目正在同时更新。当我按下Save button而不是前面时,我想要ListBox项目更改。

我尝试了所有Binding Modes

  • 单向
  • OneWayToSource
  • ....

但同样的效果发生了:当我TextBox失去焦点时,ListBox项目被改变。所以... 当我按下按钮而不是之前,我该如何激发保存事件?

我后面的代码:

private void ButtonSaveChanges_OnClick(object sender, RoutedEventArgs e) 
    { 
     DtoCustomer selectedCustomer = (DtoCustomer) ListBoxClients.SelectedItem; 
     if (selectedCustomer == null) return; 

     BindingExpression b = BindingOperations.GetBindingExpression(ListBoxClients, ListBox.ItemsSourceProperty); 
     b.UpdateSource(); 
    } 

它不工作...什么是错误的,我后面的代码?我的ListBox绑定到ObservableCollection

+1

如果我理解更新,添加UpdateSourceTrigger =显式绑定,然后调用UpdateSource方法更新源代码 http://msdn.microsoft.com/fr-fr/library/syste m.windows.data.binding.updatesourcetrigger(v = vs.110).aspx – mlemay

+0

是的,就是这样。但我的BindingExpression不起作用。只是看什么可能是错的。 – Sonhja

回答

3

您应该使用您的BindingUpdateSourceTriggerExplicit只允许在需要时进行更新。

实例为您::

<TextBox Name="TextBoxEditName" Text="{Binding ElementName=ListBoxClients, Path=SelectedItem.Name, UpdateSourceTrigger=Explicit}" /> 

在后面的代码:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
      BindingExpression b = BindingOperations.GetBindingExpression(TextBoxEditName, TextBox.TextProperty); 
      b.UpdateSource(); 
} 

这样,Binding将只在显式调用UpdateSource

+0

也许我错过了一些东西,因为它不适合我...我将我的代码复制到后面。 – Sonhja

+0

你可以检查我的代码吗?我明白你的意思,但我的ObservableCollection没有更新......任何想法? – Sonhja

+0

现在我想到了这个问题,更新的'Binding'应该是'TextBox'。显然这是一个触发变化而不是'ListBox'的'ItemsSource'。让我编辑我的帖子 – Damascus

相关问题