2016-06-25 11 views
0

Ich möchte einfach MultiBinding für ein WrapPanel ‚s ItemHeight & ItemWidth verwenden. Der Code ist wie folgt: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> 

Aber es löst Ausnahmen und rendert nicht. Ich habe auch versucht, dies in Code-Behind zu tun, aber das hat auch nicht funktioniert.

Das eigentliche Problem ist, dass ich die Elemente von WrapPanel zu einem CollectionViewSource und damit binden muß, wie ich online gelesen, ich habe die WrapPanel in einem ListView (wie oben) zu verwenden. Vorher füllte ich die WrapPanel manuell Ich hatte eine Methode, die ich verwendet wurde, um die ItemHeight und ItemWidth der WrapPanel zu berechnen und zuzuweisen. Aber jetzt, da die WrapPanel innerhalb der ListView ist, ist es in Code-Behind nicht zugänglich und daher entschied ich mich, die Multibinding zu verwenden.

Die Quelle des 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[]); 
     } 
    } 

Die Ausnahme und voller Stack-Trace, dass:

Ausnahme: InvalidCastException: Die angegebene Umwandlung ist ungültig.

Stapelüberwachung:

bei AvaPa.SensorHeightCalculator.Convert (Object [] Werte, Typ target, Objektparameter, Culture Kultur) bei System.Windows.Data.MultiBindingExpression.TransferValue() bei System.Windows .Data.MultiBindingExpression.Transfer() bei System.Windows.Data.MultiBindingExpression.UpdateTarget (Boolean includeInnerBindings) bei System.Windows.Data.MultiBindingExpression.AttachToContext (Boolean Last-Chance) bei System.Windows.Data.MultiBindingExpression.AttachOverride (DependencyObject d, DependencyProperty dp) bei System.Windows.Data.BindingExpressionBase .OnAttach (DependencyObject d, DependencyProperty dp) bei 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 Behälter, Int32 child, FrameworkObject Kind, DependencyProperty dp, FrugalStructList childRecordFromChildIndex, Framework templateRoot, EffectiveValueEntry & entry) bei System.Windows.StyleHelper.ApplyTemplatedParentValue (DependencyObject Behälter, FrameworkObject Kind, Int32 child, FrugalStructList childRecordFromChildIndex, Boolean isDetach, Framework templateRoot) bei System.Windows.FrameworkTemplate.InvalidatePropertiesOnTemplate (DependencyObject Behälter, Objekt C urrentObject) bei System.Windows.FrameworkTemplate.HandleBeforeProperties (Object createdObject, DependencyObject & rootObject, DependencyObject-Container, FrameworkElement feContainer, INameScope nameScope) bei System.Windows.FrameworkTemplate. <> c__DisplayClass45_0.b__2 (Object sender, XamlObjectEventArgs args) bei System.Xaml.XamlObjectWriter.OnBeforeProperties (Objektwert) bei System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart (ObjectWriterContext CTX) bei System.Xaml.XamlObjectWriter.WriteStartMember (XamlMember Eigenschaft) bei System.Xaml.XamlWriter.WriteNode (XamlReader Reader) bei System.Windows.FrameworkTemplate.LoadTemplateXaml (XamlReader templateReader, XamlObjectWriter currentWriter)

Vielen Dank im Voraus für die Unterstützung

+0

„Aber es Ausnahmen wirft“ - was Ausnahme? Empfohlene Lektüre - http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist. –

+0

Dies ist die Ausnahme, aber ich denke, hilft nicht wirklich: InvalidCastException: Angegebene Cast ist nicht gültig. – Amir

+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist%E2%80%8C%E2%80%8B, und fügen Sie dann die vollständige Stapelverfolgung dieser Ausnahme zu Ihrer Frage hinzu (nicht als Kommentar). Diese Ausnahme passiert wahrscheinlich auch in 'local: SensorHeightCalculator', daher sollte auch der Quellcode hinzugefügt werden. –

Antwort

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

ist eine ungültige Besetzung, wenn der dritte in der Multibinding Bindung bindet an eine ganze Zahl:

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

So gegossen auf eine ganze Zahl

var N = (int)values[2]; 

Sie sollten auch sicherstellen, dass der Wandler immer eine doppelte zurückkehrt, so ersetzen

return 300; 

mit

return 300d; 
+0

Außerdem 'UpdateSourceTrigger =" PropertyChanged " 'auf der MutliBinding macht keinen Sinn. – Clemens

+0

Also meinst du, ich muss das auf "integer" umwandeln? Und entfernen Sie den 'UpdateSourceTrigger =" PropertyChanged "'? – Amir

+0

Sicher, das ist was ich meine. – Clemens