Я сделал специальное 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 ...
}