作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的WPF MVVM项目中,我有一个按钮,该按钮触发一个函数,该函数应将节点添加到xml,然后将焦点设置为文本框。
我的问题是,我如何获得对控件的引用?
看法:
<Button Command="{Binding Path=ButtonAddCategory_Click}" />
RelayCommand buttonAddCategory_Click;
public ICommand ButtonAddCategory_Click
{
get
{
return buttonAddCategory_Click ?? (buttonAddCategory_Click = new RelayCommand(param => this.AddCategory(),
param => true));
}
}
public void AddCategory()
{
...
//get the "node" -> reference?
XmlNode selectedItem = (XmlNode)treeView.SelectedItem;
..
//add the node to the xml
..
//change focus -> reference?
textBoxTitel.Focus();
textBoxTitel.SelectAll();
}
最佳答案
不要在ViewModel中执行此操作。 ViewModel应该对 View 一无所知。
您可以在代码隐藏中进行操作:
TreeView.SelectedItemChanged
事件,并更新ViewModel上的SelectedItem
属性(也可以通过附加行为来完成)TextBox
,从ViewModel引发一个事件,并在后台代码中处理它:public XmlNode SelectedItem { get; set; }
public event EventHandler FocusTitle;
public void AddCategory()
{
...
//get the "node" -> reference?
XmlNode selectedItem = this.SelectedItem;
..
//add the node to the xml
..
// Notify the view to focus the TextBox
if (FocusTitle != null)
FocusTitle(this, EventArgs.Empty);
}
// ctor
public MyView()
{
InitializeComponent();
DataContextChanged += MyView_DataContextChanged;
}
private void MyView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
MyViewModel vm = (MyViewModel)e.NewValue;
vm.FocusTitle += ViewModel_FocusTitle;
}
private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventHandler<Object> e)
{
MyViewModel vm = (MyViewModel)DataContext;
vm.SelectedItem = (XmlNode)e.NewValue;
}
private void ViewModel_FocusTitle(object sender, EventArgs e)
{
textBoxTitle.Focus();
}
关于wpf - 如何在WPF(MVVM)中收到对控件的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595949/
我是一名优秀的程序员,十分优秀!