Пузырение RoutedEvent или RoutedCommand к ViewModel

Незаметный Javascript

лучшая практика должна добавить методы обработчика событий для ссылок.

Эти подтверждают () , функция производит диалоговое окно, которое Вы описали и возвращаете TRUE или FALSE в зависимости от выбора пользователя.

Методы обработчика событий для ссылок имеют специальное поведение, которое является, что они уничтожают действие ссылки, если они возвращают false.

var link = document.getElementById('confirmToFollow');

link.onclick = function () {
    return confirm("Are you sure?");
};

, Если Вы хотите ссылку на [1 120], требуют javascript, HTML должен быть отредактирован. Удалите href:

<a href="#" id="confirmToFollow"...

можно явно установить место назначения ссылки в конечном счете обработчик:

var link = document.getElementById('confirmToFollow');

link.onclick = function () {
    if( confirm("Are you sure?") ) {
        window.location = "http://www.stackoverflow.com/";
    }
    return false;
};

, Если Вы хотите тот же метод, обратился к нескольким ссылкам, можно получить nodeList ссылок, которые Вы хотите и применяете метод к каждому, поскольку Вы циклично выполняетесь через nodeList:

var allLinks = document.getElementsByTagName('a');
for (var i=0; i < allLinks.length; i++) {
    allLinks[i].onclick = function () {
        return confirm("Are you sure?");
    };
}

существуют дальнейшие перестановки той же идеи здесь, такие как использование имени класса для определения, какие ссылки прислушаются к методу, и передать уникальное местоположение в каждого на основе некоторых других критериев. Они - шесть из один, полдюжины из другого.

Альтернативные Подходы (не поощренные методы):

Один препятствовавшая практика должна присоединить метод через атрибут onclick :

<a href="mypage.html" onclick="...

Другой препятствовавшая практика должна установить атрибут href к вызову функции:

<a href="javascript: confirmLink() ...

Примечание, что эти нежелательные методы все работают решения.

5
задан Anderson Imes 13 August 2009 в 22:52
поделиться

3 ответа

Вы можете добавить свойство State в свою TabViewModel и проверить события DependencyPropertyChanged.

Представьте себе следующее перечисление:

public enum TabViewModelState
{
    True,
    False,
    FileNotFound
}

Затем добавьте свойство State в свою TabViewModel этого перечисления:

public static readonly DependencyProperty StateProperty =
    DependencyProperty.Register("State", typeof(TabViewModelState), typeof(TabViewModel), new PropertyMetadata(OnStateChanged));

private static void OnStateChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    TabViewModel viewModel= (TabViewModel)obj;

    //Do stuff with your viewModel
}

Используйте двустороннюю привязку к этому свойству в вашем элементе управления:

<CheckBox Checked="{Binding Path=State, Converter={StaticResource StateToBooleanConverter}, Mode=TwoWay}" />

И последнее, но не менее важное, реализуйте преобразователь, который будет преобразовывать в исходное значение, необходимое для элемента управления, и обратно. (В моем примере boolean <- > TabViewModelState):

public class StateToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        TabViewModelState state = (TabViewModelState) value;
        return state == TabViewModelState.True;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool result = (bool) value;
        return result ? TabViewModelState.True : TabViewModelState.False;
    }
}

Итак, теперь у вас есть свойство State, которое управляется пользовательским интерфейсом и генерирует измененные события, когда вам нужно ответить ..

Надеюсь, это поможет!

2
ответ дан 15 December 2019 в 01:08
поделиться

Если вы поместите команду в свою ViewModel и просто привяжете к ней из своего UserControl, она все равно сработает. Вам не нужно пузыриться, UserControl просто найдет команду и использует ее.

Если бы у вас была команда делегата GoCommand в вашей ViewModel, привязка вашей кнопки UserControls выглядела бы просто так:

<Button Command="{Binding GoCommand}" >Go</Button>

I прошел через тот же мыслительный процесс, думая, что UserControl должен выдать команду, но этого не происходит - привязка просто подключится, когда найдет команду в ViewModel.

Надеюсь, это поможет, и я не пропустил точка! ;)

GoCommand 'на вашей ViewModel, ваша привязка кнопки UserControls будет выглядеть просто так:

<Button Command="{Binding GoCommand}" >Go</Button>

Я прошел через тот же мыслительный процесс, думая, что UserControl должен выдавать команду, но этого не происходит - привязка просто подключается, когда он находит команду на ViewModel.

Надеюсь, это поможет, и я не упустил суть! ;)

GoCommand 'на вашей ViewModel, ваша привязка кнопки UserControls будет выглядеть просто так:

<Button Command="{Binding GoCommand}" >Go</Button>

Я прошел через тот же мыслительный процесс, думая, что UserControl должен выдавать команду, но этого не происходит - привязка просто подключается, когда он находит команду на ViewModel.

Надеюсь, это поможет, и я не упустил суть! ;)

1
ответ дан 15 December 2019 в 01:08
поделиться

Вам следует взглянуть на Attached Command Behavior Марлона Греча, который позволяет вам присоединять команду ViewModel к событию GUI.

1
ответ дан 15 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: