文本框绑定不起作用
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 将其属性绑定到它。这就是我在你的情况下会采取的方法。解决它的另一种方法是将一个公共实例传递给一个或两个控件,以便它们查看同一对象。
我有两个 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 将其属性绑定到它。这就是我在你的情况下会采取的方法。解决它的另一种方法是将一个公共实例传递给一个或两个控件,以便它们查看同一对象。