首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WrapPanel ItemWidth & ItemHeight MultiBinding

WrapPanel ItemWidth & ItemHeight MultiBinding
EN

Stack Overflow用户
提问于 2016-06-25 21:39:05
回答 1查看 197关注 0票数 0

我只想将MultiBinding用于WrapPanelItemHeight & ItemWidth。代码如下:

代码语言:javascript
运行
复制
<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,因此,当我在线阅读时,我必须在ListView中使用WrapPanel (如上面所示)。在此之前,我手动填充了WrapPanel --我有一个方法,用于计算WrapPanelItemHeightItemWidth并分配给它。但是现在WrapPanelListView中,它在代码隐藏中是不可访问的,因此我决定使用Multibinding

SensorHeightCalculator的来源:

代码语言:javascript
运行
复制
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:指定的强制转换无效。

堆栈跟踪:

在System.Windows.Data.MultiBindingExpression.TransferValue() at System.Windows.Data.MultiBindingExpression.Transfer() at System.Windows.Data.MultiBindingExpression.UpdateTarget(Boolean includeInnerBindings) at System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance)的AvaPa.SensorHeightCalculator.Convert(Object[]值,类型targetType、对象参数、CultureInfo区域性)( System.Windows.Data.MultiBindingExpression.AttachOverride(DependencyObject d ),DependencyProperty dp( System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d ),( System.Windows.StyleHelper.GetInstanceValue(UncommonField1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField1 dataField,ItemStructList1& valueLookupList, DependencyProperty dp, DependencyObject container, FrameworkObject child, Int32 childIndex, Boolean styleLookup, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetChildValue(UncommonField1 dataField,DependencyObject容器,Int32 childIndex,FrameworkObject child,DependencyProperty dp,FrugalStructList1& childRecordFromChildIndex, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetValueFromTemplatedParent(DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructList1& childRecordFromChildIndex,childRecordFromChildIndex,EffectiveValueEntry& entry)在System.Windows.StyleHelper.ApplyTemplatedParentValue(DependencyObject容器中,FrameworkObject,en21#,#1和,布尔,)在容器,对象)在,DependencyObject&,容器,en33#,System.Windows.FrameworkTemplate.<>c__DisplayClass45_0.b__2(Object发送者( INameScope nameScope),(以System.Xaml.XamlObjectWriter.OnBeforeProperties(Object值计算的XamlObjectEventArgs args(XamlObjectEventArgs args) )( System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)在System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember属性(System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property) )( System.Xaml.XamlWriter.WriteNode(XamlReader reader) at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader,XamlObjectWriter currentWriter)

提前感谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-25 22:06:23

代码语言:javascript
运行
复制
double N = (double)values[2];

当MultiBinding中的第三个绑定绑定到整数时,强制转换为无效:

代码语言:javascript
运行
复制
<Binding ... Path="Items.Count"/>

所以转换为整数。

代码语言:javascript
运行
复制
var N = (int)values[2];

您还应该确保转换器总是返回一个双倍,所以请替换

代码语言:javascript
运行
复制
return 300;

使用

代码语言:javascript
运行
复制
return 300d;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38033201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档