文本框绑定不起作用

TextBox binding is not working

我有两个 UserControls:

1) ContactDetailsView.

2) SearchBarView.

SearchBarView 中,我有一个 Search 按钮,单击它会引发一个命令:Command="{Binding SearchCommand}"

在后面的SearchBarView代码中,我有如下代码:DataContext = new SearchBarViewModel();

ContactDetailsView中我有以下代码:

xmlns:ViewModel="clr-namespace:Accounts_Manager.UserControls.SearchBar"UserControl 的定义中及其下面的代码:

<UserControl.DataContext> <ViewModel:SearchBarViewModel /> </UserControl.DataContext>

我还有一个TextBox,定义如下:

<TextBox x:Name="ContactNameTextBox" FontFamily="Times New Roman" Foreground="DarkRed" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" IsEnabled="False" Grid.Column="0" Text="{Binding ContactId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

我有一个名为 SearchBarViewModel 的 class,代码如下:

    public string ContactId
    {
        get { return m_contactId; }
        set
        {
            m_contactId = value;
            OnPropertyChanged("ContactId");
        }
    }
    public ICommand SearchCommand
    {
        get { return m_searchCommand ?? (m_searchCommand = new RelayCommand(SearchContact)); }
        set { m_searchCommand = value; }
    }
    public void SearchContact(object parameter)
    {
        CurrentContact = DbHandler.Search("עידן");

        ContactId = CurrentContact.FirstName + " " + CurrentContact.LastName;
        BankId = CurrentContact.BankName;
        AccountNumber = CurrentContact.AccountNumber.ToString();
    }

class是这样定义的; SearchBarViewModel : ViewModelBase 其中 ViewModelBase 继承自 INotifyPropertyChanged 并实现了它。

RelayCommand 继承自 ICommand 并实现它。

现在,在所有这一切之后,我的问题是当我单击 Search 按钮时,希望 TextBox 被更新,我看到所有的东西都在被调用和更新,属性 正在引发,但 TextBox 未更新为 ContactId.

的值

有什么想法吗?

很简单,您使用了两个不同的对象!

SearchBarView 中的

DataContext = new SearchBarViewModel() 将按钮所在的 DataContext 设置为 SearchBarViewModel 的实例。没问题。

但你随后

<UserControl.DataContext>
    <ViewModel:SearchBarViewModel />
</UserControl.DataContext>

在另一个视图中,创建了该对象的一个​​实例。因此,命令调用更改了视图模型的 its 实例上的一个变量,而另一个实例显然看不到。

用户控件(如搜索栏)通常没有自己的数据上下文,您可以使用依赖属性来允许主 VM 将其属性绑定到它。这就是我在你的情况下会采取的方法。解决它的另一种方法是将一个公共实例传递给一个或两个控件,以便它们查看同一对象。