This commit is contained in:
NaBian committed 2020-04-27 22:46:22 +08:00
1 parent 12689384a5
commit 3eb802d4e3
1 file changed
+51 -53
@@ -39,16 +39,16 @@ namespace HandyControl.Tools.Extension
=> element.SetValue(TargetPropertyProperty, value); => element.SetValue(TargetPropertyProperty, value);
private static DependencyProperty GetTargetProperty(DependencyObject element) private static DependencyProperty GetTargetProperty(DependencyObject element)
=> (DependencyProperty) element.GetValue(TargetPropertyProperty); => (DependencyProperty)element.GetValue(TargetPropertyProperty);
public BindingMode Mode { get; set; } public BindingMode Mode { get; set; }
public IValueConverter Converter { get; set; } public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; } public object ConverterParameter { get; set; }
public object Source { get; set; } public object Source { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider) public override object ProvideValue(IServiceProvider serviceProvider)
{ {
if (_isInternalAction) return this; if (_isInternalAction) return this;
@@ -60,50 +60,48 @@ namespace HandyControl.Tools.Extension
switch (Key) switch (Key)
{ {
case string key: case string key:
{
var binding = new Binding(key)
{ {
Converter = Converter, var binding = new Binding(key)
ConverterParameter = ConverterParameter, {
UpdateSourceTrigger = UpdateSourceTrigger.Explicit, Converter = Converter,
Source = Source, ConverterParameter = ConverterParameter,
Mode = BindingMode.OneWay UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
}; Source = Source,
BindingOperations.SetBinding(targetObject, targetProperty, binding); Mode = BindingMode.OneWay
return binding.ProvideValue(serviceProvider); };
} BindingOperations.SetBinding(targetObject, targetProperty, binding);
return binding.ProvideValue(serviceProvider);
}
case Binding keyBinding when targetObject is FrameworkElement element: case Binding keyBinding when targetObject is FrameworkElement element:
{
if (element.DataContext != null)
{
_isInternalAction = true;
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
_isInternalAction = false;
}
else
{ {
if (element.DataContext != null)
{
_isInternalAction = true;
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
_isInternalAction = false;
return element.GetValue(targetProperty);
}
SetTargetProperty(element, targetProperty); SetTargetProperty(element, targetProperty);
element.DataContextChanged += LangExtension_DataContextChanged; element.DataContextChanged += LangExtension_DataContextChanged;
}
break; break;
} }
case Binding keyBinding when targetObject is FrameworkContentElement element: case Binding keyBinding when targetObject is FrameworkContentElement element:
{
if (element.DataContext != null)
{
_isInternalAction = true;
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
_isInternalAction = false;
}
else
{ {
if (element.DataContext != null)
{
_isInternalAction = true;
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
_isInternalAction = false;
return element.GetValue(targetProperty);
}
SetTargetProperty(element, targetProperty); SetTargetProperty(element, targetProperty);
element.DataContextChanged += LangExtension_DataContextChanged; element.DataContextChanged += LangExtension_DataContextChanged;
}
break; break;
} }
} }
return string.Empty; return string.Empty;
@@ -114,25 +112,25 @@ namespace HandyControl.Tools.Extension
switch (sender) switch (sender)
{ {
case FrameworkElement element: case FrameworkElement element:
{ {
element.DataContextChanged -= LangExtension_DataContextChanged; element.DataContextChanged -= LangExtension_DataContextChanged;
if (!(Key is Binding keyBinding)) return; if (!(Key is Binding keyBinding)) return;
var targetProperty = GetTargetProperty(element); var targetProperty = GetTargetProperty(element);
SetTargetProperty(element, null); SetTargetProperty(element, null);
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext); SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
break; break;
} }
case FrameworkContentElement element: case FrameworkContentElement element:
{ {
element.DataContextChanged -= LangExtension_DataContextChanged; element.DataContextChanged -= LangExtension_DataContextChanged;
if (!(Key is Binding keyBinding)) return; if (!(Key is Binding keyBinding)) return;
var targetProperty = GetTargetProperty(element); var targetProperty = GetTargetProperty(element);
SetTargetProperty(element, null); SetTargetProperty(element, null);
SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext); SetLangBinding(element, targetProperty, keyBinding.Path, element.DataContext);
break; break;
} }
} }
} }