2012-10-18 4 views
1

У меня есть проект MVV MVVM, где я пытаюсь установить значение настраиваемого прикрепленного свойства с помощью мультиконвертера, которому должно быть передано свойство DataContext (ViewModel) и другое пользовательское прикрепленное свойство на элементе.Использование multibinding для установки пользовательского прикрепленного свойства в WPF

Я могу привязать свойство к viewmodel напрямую, используя синтаксис атрибута 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> 

код, например, прилагаемые свойства и 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(); 
    } 
} 

Спасибо за любую помощь, которую вы можете предложить!

ответ

3

Вы могли бы попробовать это и адаптировать к коду:

 <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> 

Это для набора преобразователя MultiBinding, но я думаю, что вы могли бы управлять этим поведением от вашего «MainViewModel» или модель представления для главное окно. может быть, может быть проще, или, может быть, запустить. Надеюсь, это будет полезно для вас ...

+0

Я надеялся избежать этого пути, но в конечном итоге пошел таким путем. – eoldre

+0

Это то, как я знаю, для выполнения нескольких привязок ... Я тестировал и работал –

Смежные вопросы