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
„Aber es Ausnahmen wirft“ - was Ausnahme? Empfohlene Lektüre - http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist. –
Dies ist die Ausnahme, aber ich denke, hilft nicht wirklich: InvalidCastException: Angegebene Cast ist nicht gültig. – Amir
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. –