2016-03-21 3 views
1

HelloAll: Я пытаюсь создать пользовательский элемент управления, который нуждается в MultiValueConverter для Масштабирование холста в моем приложении:MultiValueConverter Неспособность Привязать к ViewModel

Он принимает

  1. Canvas.ActualWidth
  2. в X Мин инженерных единиц
  3. X Макс ЭСН Units

.

public class MultiValueScaleTransform : IMultiValueConverter 
{ 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      double numerator  = (double)values[0]; 
      double denominator = (double)values[2] - (double)values[1]; 
      return numerator/denominator; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
} 

Это, кажется, работает хорошо, когда я кормлю его номером, но когда я связать мой XAML, чтобы посмотреть проблемы моделей происходят:

Вот тзд ошибки:

Ошибка 7 A «Binding 'нельзя установить в свойстве «Путь» типа «Связывание». «Связывание» может быть установлено только на DependencyProperty объекта DependencyObject. C: \ Users \ mwardell \ Documents \ Visual Studio 2013 \ Projects \ HalliburtonCallouts (12) \ HalliburtonCallouts \ HalliburtonCallouts \ View \ элементы управления UserControl \ WellViewUserCtrl.xaml 31 38 HalliburtonCallouts

<UserControl x:Class="HalliburtonCallouts.View.UserControls.WellViewUserCtrl" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:Converters="clr-namespace:HalliburtonCallouts.ViewModel.Converters" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       mc:Ignorable="d" 
       d:DesignHeight="300" d:DesignWidth="300" 
       x:Name="uc"> 
     <UserControl.Resources> 
      <Converters:ColorToImageBrush x:Key="ColorToBrush"/> 
      <Converters:ColorToBitmapBrush x:Key="ColorToImg"/> 
      <Converters:ColorToBG x:Key="ColorToBG"/> 
      <Converters:ColorToFG x:Key="ColorToFG"/> 
      <Converters:MultiValueScaleTransform x:Key="ScaleTransform"/> 
      <SolidColorBrush x:Key="BlueBg" Color="#FFA9DCF1"/> 
     </UserControl.Resources> 
     <Border Background="Red"> 
      <StackPanel> 
       <!-- I used these to make sure the bindings of the user control are working--> 
       <TextBlock Text="OverallStartDepth"></TextBlock> 
       <TextBlock Text="{Binding OverallStartDepth}"></TextBlock> 
       <TextBlock Text="OverallEndDepth"></TextBlock> 
       <TextBlock Text="{Binding OverallEndDepth}"></TextBlock> 
       <Canvas x:Name="WellCanvas" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource PreviousData}}" > 
       <Canvas.RenderTransform> 
        <ScaleTransform > 
          <ScaleTransform.ScaleX > 
          <MultiBinding Converter="{StaticResource ScaleTransform}"> 
           <Binding Path="ActualWidth"/> 
           <Binding Path="{Binding OverallStartDepth, FallbackValue=0.0}"/> 
           <Binding Path="{Binding OverallEndDepth,FallbackValue=100.0}"/> 
          </MultiBinding> 
         </ScaleTransform.ScaleX> 

        </ScaleTransform> 
       </Canvas.RenderTransform> 
      </Canvas> 
     </StackPanel> 
     </Border> 
    </UserControl> 

я определил, что OverallEndDepth и OverallStartDepth являются связующими. См. StackPanel первые четыре пункта или около того. Не означает ли Bindability, что они являются свойствами Dep Dep Dep?

ответ

2

Вы не можете и не будете связывать свойства привязок Path в MultiBinding.Вместо этого, вы просто установить их, как в

<TextBlock Text="{Binding OverallStartDepth}"> 

что эквивалентно

<TextBlock Text="{Binding Path=OverallStartDepth}"> 

, а также к

<TextBlock> 
    <TextBlock.Text> 
     <Binding Path="OverallStartDepth"/> 
    </TextBlock.Text> 
</TextBlock> 

Так MultiBinding просто должны быть написаны так:

<Canvas ... > 
    <Canvas.RenderTransform> 

     <MultiBinding Converter="{StaticResource ScaleTransform}"> 
      <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType=Canvas}"/> 
      <Binding Path="OverallStartDepth" FallbackValue="0.0"/> 
      <Binding Path="OverallEndDepth" FallbackValue="100.0"/> 
     </MultiBinding> 
    </Canvas.RenderTransform> 
</Canvas> 

Также убедитесь, что y НУ удалить

DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource PreviousData}}" 

от Canvas

+0

Спасибо @Clemens У меня нет намерения сохранить TextBlock для привязки of OveralEndDepth/StartDepth. Это двойные свойства. Когда я реализую, как было предложено, я получаю литую ошибку. Начиная с

+0

Так что я все еще застрял. Почему мы поддерживаем то, что не решает проблему. кажется странным –

+0

'ActualWidth' не является собственностью вашего вида модели, поэтому вам нужно указать источник привязки. См. Мое редактирование. – Clemens

2

Как говорится в ошибке, вы не можете использовать {Binding}, вместо этого вы можете получить элемент по его названию и получить значение из его свойства text.

<TextBlock Text="OverallStartDepth"></TextBlock> 
<TextBlock Name="OverallStartDepthTextBlock" Text="{Binding OverallStartDepth}"></TextBlock> 
<TextBlock Text="OverallEndDepth"></TextBlock> 
<TextBlock Name="OverallEndDepthTextBlock" Text="{Binding OverallEndDepth}"></TextBlock> 
<MultiBinding Converter="{StaticResource ScaleTransform}"> 
    <Binding Path="ActualWidth"/> 
    <Binding ElementName="OverallStartDepthTextBlock" Path="Text"/> 
    <Binding ElementName="OverallEndDepthTextBlock" Path="Text"/> 
</MultiBinding> 

Примечание: Вы можете связать OverallEndDepth это значение, которое Привязываемое к зависимости свойство какого-либо контроля.

например. TextBlock.Text является зависимость собственность- SourceCode

/// <summary> 
    /// DependencyProperty for <see cref="Text" /> property. 
    /// </summary> 
    [CommonDependencyProperty] 
    public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register(
        "Text", 
        typeof(string), 
        typeof(TextBlock), 
        new FrameworkPropertyMetadata(
          string.Empty, 
          FrameworkPropertyMetadataOptions.AffectsMeasure | 
          FrameworkPropertyMetadataOptions.AffectsRender, 
          new PropertyChangedCallback(OnTextChanged), 
          new CoerceValueCallback(CoerceText))); 

    /// <summary> 
    /// The Text property defines the content (text) to be displayed. 
    /// </summary> 
    [Localizability(LocalizationCategory.Text)] 
    public string Text 
    { 
     get { return (string) GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

Но Binding.Path является обычной собственностью и не может быть связан, следовательно, вы получаете вышеописанный error- SourceCode

/// <summary> The source path (for CLR bindings).</summary> 
public PropertyPath Path 
{ 
    get { return _ppath; } 
    set 
    { 
     CheckSealed(); 

     _ppath = value; 
     _attachedPropertiesInPath = -1; 
     ClearFlag(BindingFlags.PathGeneratedInternally); 

     if (_ppath != null && _ppath.StartsWithStaticProperty) 
     { 
      if (_sourceInUse == SourceProperties.None || _sourceInUse == SourceProperties.StaticSource || 
       FrameworkCompatibilityPreferences.TargetsDesktop_V4_0) // (for compat - Dev11 738992) 
      { 
       SourceReference = StaticSourceRef; 
      } 
      else 
       throw new InvalidOperationException(SR.Get(SRID.BindingConflict, SourceProperties.StaticSource, _sourceInUse));>    } 
    } 
} 
+0

Ни один из вышеуказанных ответов на самом деле решить, если я не хочу связываться с чем-то, что связывает со значением. Se reissued Question http://stackoverflow.com/questions/36139592/not-duplicate-multibinding-wont-allow-me-so-far-to-bind-binding –

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