使用多重绑定在 WPF 中设置自定义附加属性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12957391/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using multibinding to set custom attached property in WPF
提问by eoldre
I have a MVVM WPF project where I am attempting to set the value of a custom attached property using a multiconverter, which should be passed a property of the DataContext (ViewModel) and another custom attached property on the element.
我有一个 MVVM WPF 项目,我试图在其中使用多转换器设置自定义附加属性的值,该值应该传递 DataContext (ViewModel) 的属性和元素上的另一个自定义附加属性。
I can bind the property to the viewmodel directly using the xaml attribute syntax, but I'm having trouble understanding how to set the value of the attached property using a multiconverter.
我可以使用 xaml 属性语法直接将属性绑定到视图模型,但是我无法理解如何使用多转换器设置附加属性的值。
<StackPanel>
<StackPanel.Resources>
<example:HelpTextConverter x:Key="ConvertHelpText"></example:HelpTextConverter>
</StackPanel.Resources>
<!-- shows binding the help text properties directly to the ViewModel's property -->
<Border example:HelpTextProperties.HelpText="{Binding HelpText}"></Border>
<!--how to set the HelpText attached property as the result of passing the DataContext.HelpText and the HelpTextProperties.ShowHelpText property to the HelpTextConverter?-->
<Border>
<example:HelpTextProperties.HelpText>
<!--does not compile-->
</example:HelpTextProperties.HelpText>
</Border>
</StackPanel>
code for example attached properties and IMultiValueConverter below.
例如下面的附加属性和 IMultiValueConverter 代码。
class HelpTextProperties
{
public static readonly DependencyProperty ShowHelpTextProperty =
DependencyProperty.RegisterAttached("ShowHelpText", typeof(bool), typeof(HelpTextProperties),
new UIPropertyMetadata(false));
public static bool GetShowHelpText(UIElement target)
{
return (bool)target.GetValue(ShowHelpTextProperty);
}
public static void SetShowHelpText(UIElement target, bool value)
{
target.SetValue(ShowHelpTextProperty, value);
}
public static readonly DependencyProperty HelpTextProperty =
DependencyProperty.RegisterAttached("HelpText", typeof(LabelVM), typeof(HelpTextProperties),
new UIPropertyMetadata(null));
public static LabelVM GetHelpText(UIElement target)
{
return (LabelVM)target.GetValue(ShowHelpTextProperty);
}
public static void SetHelpText(UIElement target, LabelVM value)
{
target.SetValue(ShowHelpTextProperty, value);
}
}
class HelpTextConverter : IMultiValueConverter
{
/// <summary>
/// returns the label in values[0] if values[1] is true
/// </summary>
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
LabelVM labelVM = (LabelVM)values[0];
if (values[0] == DependencyProperty.UnsetValue) { return null; }
if (values[1] is bool)
{
if ((bool)values[1]) { return labelVM; }
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Thanks for any help you can offer!
谢谢你的尽心帮助!
回答by Raúl Ota?o
You could try this and adapt to your code:
你可以试试这个并适应你的代码:
<Border>
<example:HelpTextProperties.HelpText>
<MultiBinding Converter="{StaticResource ResourceKey=ConvertHelpText}">
<Binding Path="HelpText"/> <!--The property that you wants, from DataContext or Dependency Property-->
<Binding Path="ShowLabel"/> <!--Same thing, the property that you wants-->
</MultiBinding>
</example:HelpTextProperties.HelpText>
</Border>
This is for set the multibinding converter, but also i think that you could manage this behavior from your "MainViewModel" or the view model for the main window. maybe could be simpler, or trigger maybe. Hope this will helpful to you...
这是用于设置多绑定转换器,但我认为您可以从“MainViewModel”或主窗口的视图模型管理此行为。也许可以更简单,或者触发也许。希望这对你有帮助...

