MVVM ListView& TextBox绑定SelectedItem

时间:2016-04-14 20:32:58

标签: c# wpf xaml listview mvvm

我想将ListViews SelectedItem绑定到我的TextBox ..我做的是以下内容:

        private User _selectedUser;
        public User SelectedUser
        {
            get { return _selectedUser; }
            set
            {
                _selectedUser = value;
                RaisePropertyChanged("SelectedUser");
            }
        }

ListView Xaml:

    <ListView HorizontalAlignment="Left" 
              Height="194"
              Margin="37,102,0,0" 
              SelectedItem="{Binding SelectedItem}"

Textbox Xaml:

    <TextBox Text="{Binding SelectedItem.FirstName}" />

如果我从列表视图中选择了一个条目,它会在文本框中显示所选条目的名称值。应该是这样,没问题。

问题是:我想编辑文本框中的文本,当我按下按钮时,它应该使用我在文本框中输入的名称更新选择名称。 只有按下按钮才会这样做,但是当我从文本框中失去焦点时,它现在已经更改了条目名称。

我该如何解决?我已经尝试了所有不同的模式,但似乎没有任何工作

2 个答案:

答案 0 :(得分:1)

这正是你正在告诉它要做的事情。 ListView和TextBox都绑定到完全相同的东西。因此,当您更改一个时,更改立即反映出来。

如果你想达到你想要的听起来,你需要将FirstName复制到另一个属性(让我们称之为SelectedFirstName),允许用户编辑TextBox中的值,然后当用户单击按钮时,使用FirstName

中的值更新所选项的SelectedFirstName属性

答案 1 :(得分:0)

来自MSDN

  

TextBox.Text属性的默认UpdateSourceTrigger值为   引发LostFocus。这意味着如果应用程序具有带有的TextBox   数据绑定TextBox.Text属性,您在TextBox中键入的文本   在TextBox失去焦点之前不会更新源(for   例如,当您单击TextBox时。)

如果您希望在其他时间更新您的来源(而不是在TextBox失去焦点时),您应该使用UpdateSourceTrigger属性。例如,您可以说明<TextBox Text="{Binding SelectedItem.FirstName, UpdateSourceTrigger=Explicit}" />,然后仅在按下按钮时调用UpdateSource方法。阅读文档链接了解详细信息:

  

如果您有对话框或用户可编辑的表单,并且您想要推迟   源更新,直到用户完成编辑字段和   单击“确定”,您可以设置您的UpdateSourceTrigger值   绑定到Explicit,如下例所示:

<TextBox Name="itemNameTextBox"
         Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
  

将UpdateSourceTrigger值设置为Explicit时,源   值仅在应用程序调用UpdateSource方法时更改。   以下示例显示如何为其调用UpdateSource   itemNameTextBox:

// itemNameTextBox is an instance of a TextBox
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();