我有两个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
这个类是这样定义的; 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();
}
其中SearchBarViewModel : ViewModelBase
继承自ViewModelBase
并实现它。
INotifyPropertyChanged
继承自RelayCommand
并实现它。
现在,在所有这些之后,我的问题是,当我点击ICommand
按钮,期望更新Search
时,我看到所有内容都被调用和更新,属性正在已提升,但TextBox
未使用TextBox
的值进行更新。
有什么想法吗?
答案 0 :(得分:2)
很简单,你正在使用两个不同的对象!
DataContext = new SearchBarViewModel()
中的 SearchBarView
将按钮所在的DataContext设置为SearchBarViewModel
的实例。没问题。
但你做了
<UserControl.DataContext>
<ViewModel:SearchBarViewModel />
</UserControl.DataContext>
在另一个视图中,还创建该对象的实例。因此,命令调用会更改视图模型的其实例上的变量,而另一个实例显然看不到。
用户控件(如搜索栏)通常没有自己的数据上下文,您使用依赖项属性来允许主VM将其属性绑定到它。这是我将采取的方法。另一种解决方法是将一个公共实例传递给一个或两个控件,以便它们查看同一个对象。