WPF Доступ к DataContext в CustomMarkup для привязки DataTrigger - PullRequest
0 голосов
/ 26 мая 2018

Я сделал специальное MarkupExtension, чтобы создать привязку для моей ViewModel, потому что мне нужно вызвать метод для получения объекта и создать привязку к свойству возвращаемого объекта.

Пока это работает хорошодля привязок свойств элемента управления, таких как TextBox.Text и т. д.

Я хочу использовать то же поведение для привязки DataTrigger, но это не работает, потому что мой MarkupExtension вызывается с DataTrigger как TargetObject и у него нет DataContext,

Есть ли способ получить доступ к моему DataContext (ViewModel) в этом случае?

В качестве обходного пути я попытался использовать пользовательский ValueConverter и использовать DataTrigger Binding = "{Binding}"для передачи DataContext (ViewModel) преобразователю, и преобразователь возвращает значение свойства, это работает для первого вызова, но не обновляется, если значение свойства изменяется, потому что актуальная привязка относится к ViewModel (которая не изменяется) так что это тоже не сработало.

// Example
public class ExampleMarkup : MarkupExtension
{
    public string PropertyName { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var targetProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;

        // For bindings on normal controls/properties (for example TextBox.Text) this returns the FrameworkElement
        var element = targetProvider.TargetObject as FrameworkElement;

        var viewModel = element.DataContext as ViewModel;
        var property = viewModel.GetProperty(PropertyName);

        // But for a DataTrigger Binding the TargetObject is the DataTrigger which does not have a DataContext 
        // How can i get access to my model to call the GetProperty method?

        // ... other code ...

        // ... create a binding for the property instance and return it ...
    }
}

public class Property : INotifyPropertyChanged
{
    // ... other code ...

    private string _value;
    public string Value
    {
        get => _value;
        set
        {
            _value = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    // ... other code ...
}

public class ViewModel
{
    // ... other code ...

    // Returns the property instance
    public Property GetProperty(string id)
    {
        // ... code to find/return the property ...
    }

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