Как я могу получить ссылку на элемент управления в WPF (MVVM)? - PullRequest
2 голосов
/ 08 апреля 2011

В моем проекте WPF MVVM у меня есть кнопка, которая запускает функцию, которая должна добавить узел в XML, а затем установить фокус на текстовое поле.У меня вопрос, как я могу получить ссылку на элемент управления?

Просмотр:

<Button Command="{Binding Path=ButtonAddCategory_Click}" />

ViewModel:

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();
}

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Не делайте этого в ViewModel. ViewModel не должна знать ничего о представлении.

Вы можете сделать это в программном коде:

  • обработать событие TreeView.SelectedItemChanged в программном коде и обновить свойство SelectedItem в ViewModel (выможет также сделать это с прикрепленным поведением)

  • , чтобы сфокусировать TextBox, вызвать событие из ViewModel и обработать его в коде:

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();
}
1 голос
/ 08 апреля 2011

Вы можете использовать присоединенное свойство FocusManager.FocusedElement, чтобы обеспечить получение фокуса TextBox.

<DataTemplate DataType="{x:Type YourViewModel}">
    <Grid FocusManager.FocusedElement="{Binding ElementName=userInput}">
       <TextBox x:Name="userInput" />
    </Grid>
</DataTemplate>

Что касается вашей второй части (textBox.SelectAll()), то у вас может бытьработать над поведением или собственным свойством, которое обрабатывает фокусировку и выбор одним махом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...