2016-06-25 12 views
0

Я просто хочу, чтобы использовать MultiBinding для WrapPanel «s ItemHeight & ItemWidth. Код выглядит следующим образом:WrapPanel ItemWidth & ItemHeight MultiBinding

<Window.Resources> 
    <local:SensorHeightCalculator x:Key="HeightCalculator"/> 
    <local:SensorWidthCalculator x:Key="WidthCalculator"/> 
</Window.Resources> 

<Border x:Name="sensorPanelBorder" BorderBrush="#FFD5DFE5" BorderThickness="1" Grid.Column="2" Margin="0,9,2,2" CornerRadius="3"> 
    <ListView x:Name="sensorPanel" Margin="0" ItemsSource="{Binding Source={StaticResource SensorControls}}"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel x:Name="sensorWrapPanel" IsItemsHost="True"> 
        <WrapPanel.ItemHeight> 
         <MultiBinding Converter="{StaticResource HeightCalculator}" UpdateSourceTrigger="PropertyChanged"> 
          <Binding ElementName="sensorPanelBorder" Path="ActualHeight"/> 
          <Binding ElementName="sensorPanelBorder" Path="ActualWidth"/> 
          <Binding ElementName="sensorPanel" Path="Items.Count"/> 
         </MultiBinding> 
        </WrapPanel.ItemHeight> 
       </WrapPanel> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
    </ListView> 
</Border> 

Но он выдает исключения и не отображает. Я также пытался сделать это в коде, но это тоже не сработало.

Реальная проблема заключается в том, что мне нужно, чтобы связать пункты WrapPanel к CollectionViewSource, и поэтому, как я прочитал в Интернете, я должен использовать WrapPanel внутри ListView (как выше). До этого я заполнил WrapPanel вручную, у меня был метод, который я использовал для вычисления ItemHeight и ItemWidthWrapPanel и назначил ему это. Но теперь, когда WrapPanel находится внутри ListView, он недоступен в кодировке и, следовательно, я решил использовать Multibinding.

Источник SensorHeightCalculator:

public class SensorHeightCalculator : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      double H = (double)values[0]; 
      double W = (double)values[1]; 
      double N = (double)values[2]; 
      if (N > 0) 
      { 
       double k = 7.0/6.0; 
       double c = N; 
       double r = 1; 
       double ah, aw, a, b; 
       do 
       { 
        aw = (W - 2)/c; 
        ah = k * aw; 
        if (Math.Floor(H/ah) <= r) break; 
        else 
        { 
         r++; 
         c = c - Math.Floor(c/r); 
        } 
       } while (r <= N); 
       a = Math.Min(aw, H/(k * r)); 
       b = k * a; 
       return b - 10; 
      } 
      else 
       return 300; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      return default(object[]); 
     } 
    } 

Исключение и полный стек след, что:

Исключение: InvalidCastException: Указанный литая не является действительным.

Стек трассировки:

в AvaPa.SensorHeightCalculator.Convert (Object [] значения, тип TargetType, параметр объекта, CultureInfo культуры) в System.Windows.Data.MultiBindingExpression.TransferValue() в System.Windows .Data.MultiBindingExpression.Transfer() в System.Windows.Data.MultiBindingExpression.UpdateTarget (Boolean) includeInnerBindings в System.Windows.Data.MultiBindingExpression.AttachToContext (Boolean) LastChance в System.Windows.Data.MultiBindingExpression.AttachOverride (DependencyObject d, DependencyProperty dp) в System.Windows.Data.BindingExpressionBase .OnAttach (DependencyObject д, DependencyProperty др) на System.Windows.StyleHelper.GetInstanceValue (UncommonField 1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField 1 DataField, ItemStructList 1& valueLookupList, DependencyProperty dp, DependencyObject container, FrameworkObject child, Int32 childIndex, Boolean styleLookup, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetChildValue(UncommonField 1 DataField, DependencyObject контейнер, Int32 childIndex, FrameworkObject ребенок, DependencyProperty дп, FrugalStructList childRecordFromChildIndex, FrameworkElementFactory templateRoot, EffectiveValueEntry & запись) на System.Windows.StyleHelper.ApplyTemplatedParentValue (DependencyObject контейнера, FrameworkObject ребенка, Int32 childIndex, FrugalStructList childRecordFromChildIndex, булева isDetach, FrameworkElementFactory templateRoot) на System.Windows.FrameworkTemplate.InvalidatePropertiesOnTemplate (DependencyObject контейнер, объект с urrentObject) в System.Windows.FrameworkTemplate.HandleBeforeProperties (Object createdObject, DependencyObject & rootObject, контейнер DependencyObject, FrameworkElement feContainer, имя INameScopeScope) в System.Windows.FrameworkTemplate. <> c__DisplayClass45_0.b__2 (отправитель объекта, XamlObjectEventArgs арг) в System.Xaml.XamlObjectWriter.OnBeforeProperties (значение объекта) в System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart (ObjectWriterContext СТХ) в System.Xaml.XamlObjectWriter.WriteStartMember (свойство XamlMember) в System.Xaml.XamlWriter.WriteNode (считыватель XamlReader) в System.Windows.FrameworkTemplate.LoadTemplateXaml (XamlReader templateReader, XamlObjectWriter currentWriter)

Заранее спасибо за помощь

+0

«Но он выбрасывает исключения» - то, что исключение? Рекомендуемое чтение - http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist. –

+0

Это исключение, но я думаю, что это действительно не помогает: InvalidCastException: Указанный приказ недействителен. – Amir

+0

Пожалуйста, прочитайте http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist%E2%80%8C%E2%80%8B, затем добавьте полную трассировку стека этого исключения в свой вопрос (не как комментарий). Кроме того, это исключение, вероятно, происходит в 'local: SensorHeightCalculator', поэтому его исходный код также должен быть добавлен. –

ответ

3
double N = (double)values[2]; 

является недействительным литая, когда третье связывание в MultiBinding связывается с целым числом:

<Binding ... Path="Items.Count"/> 

Так отлитые в целое число

var N = (int)values[2]; 

Вы также должны убедиться в том, что преобразователь всегда возвращает двойной, поэтому заменить

return 300; 

с

return 300d; 
+0

Кроме того, 'UpdateSourceTrigger =" PropertyChanged " 'на MutliBinding не имеет смысла. – Clemens

+0

Значит, вы имеете в виду, что я должен отдать это целому числу? И удалите 'UpdateSourceTrigger =" PropertyChanged "'? – Amir

+0

Конечно, вот что я имею в виду. – Clemens

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