[.net] ListBox مع الشبكة كما ItemsPanelTemplate تنتج أخطاء ملزمة غريبة


Answers

سيؤدي تعيين OverridesDefaultStyle إلى True في ItemContainerStyle إلى إصلاح هذه المشكلات أيضًا.

<Style TargetType="ListBoxItem">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <!-- set the rest of your setters, including Template, here -->
</Style>
Question

لقد حصلت على التحكم ListBox وأنا أقدم عدد ثابت من الكائنات ListBoxItem في تخطيط الشبكة. لذا قمت بتعيين ItemsPanelTemplate الخاص بي ليكون شبكة.

أنا بصدد الوصول إلى الشبكة من التعليمات البرمجية خلف لتكوين RowDefinitions و ColumnDefinitions.

حتى الآن كل شيء يعمل كما أتوقع. لقد حصلت بعض تطبيقات IValueConverter مخصصة لإرجاع Grid.Row و Grid.Column التي يجب أن تظهر كل ListBoxItem في.

ومع ذلك ، فأنا أحصل على أخطاء ملزمة غريبة أحيانًا ، ولا يمكنني معرفة سبب حدوثها بالضبط ، أو حتى إذا كانت مدرجة في شفرتي.

إليك الخطأ الذي أحصل عليه:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

أي شخص يمكن أن يفسر ما يجري؟

أوه ، وإليك هنا XAML:

<UserControl.Resources>
    <!-- Value Converters -->
    <v:GridRowConverter x:Key="GridRowConverter" />
    <v:GridColumnConverter x:Key="GridColumnConverter" />
    <v:DevicePositionConverter x:Key="DevicePositionConverter" />
    <v:DeviceBackgroundConverter x:Key="DeviceBackgroundConverter" />

    <Style x:Key="DeviceContainerStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="Background" Value="Transparent" />

        <Setter Property="Grid.Row" Value="{Binding Path=DeviceId, Converter={StaticResource GridRowConverter}}" />
        <Setter Property="Grid.Column" Value="{Binding Path=DeviceId, Converter={StaticResource GridColumnConverter}}" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border CornerRadius="2" BorderThickness="1" BorderBrush="White" Margin="2" Name="Bd"
                            Background="{Binding Converter={StaticResource DeviceBackgroundConverter}}">
                        <TextBlock FontSize="12" HorizontalAlignment="Center" VerticalAlignment="Center" 
                                Text="{Binding Path=DeviceId, Converter={StaticResource DevicePositionConverter}}" >
                            <TextBlock.LayoutTransform>
                                <RotateTransform Angle="270" />
                            </TextBlock.LayoutTransform>
                        </TextBlock>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Bd" Property="BorderThickness" Value="2" />
                            <Setter TargetName="Bd" Property="Margin" Value="1" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>            
    </Style>        
</UserControl.Resources>

<Border CornerRadius="3" BorderThickness="3" Background="#FF333333" BorderBrush="#FF333333" >
    <Grid ShowGridLines="False">
        <Grid.RowDefinitions>
            <RowDefinition Height="15" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <Image Margin="20,3,3,3" Source="Barcode.GIF" Width="60" Stretch="Fill" />
        </StackPanel>

        <ListBox ItemsSource="{Binding}" x:Name="lstDevices" Grid.Row="1" 
                 ItemContainerStyle="{StaticResource DeviceContainerStyle}"
                 Background="#FF333333"
                 SelectedItem="{Binding SelectedDeviceResult, ElementName=root, Mode=TwoWay}" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.LayoutTransform>
                            <RotateTransform Angle="90" />
                        </Grid.LayoutTransform>                            
                    </Grid>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
</Border>




هذا العمل بالنسبة لي. ضع هذا في ملف Application.xaml الخاص بك.

<Application.Resources>
    <Style TargetType="ListBoxItem">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
    </Style>
</Application.Resources>

من عند...

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/42cd1554-de7a




هذا هو مزيج من الإجابات الأخرى هنا ، ولكن بالنسبة لي ، كان عليّ تطبيق أداة Setter في مكانين لحل الخطأ ، على الرغم من أن ذلك كان عند استخدام VirtualizingWrapPanel مخصص

إذا قمت بإزالة أحد تعريفات Setter المذكورة أدناه ، فإن Setter مرة أخرى.

        <ListView>
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Left" />
                    <Setter Property="VerticalContentAlignment" Value="Top" />
                </Style>
            </ListView.Resources>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Left" />
                    <Setter Property="VerticalContentAlignment" Value="Top" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <controls:VirtualizingWrapPanel />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>

ليس لدي وقت للتحقيق أكثر في الوقت الحالي ، ولكن أظن أنه مرتبط بالنمط الافتراضي الذي يشير إليه JTango في إجابته - أنا لا أقوم بتخصيص القالب إلى درجة كبيرة.

أعتقد أن هناك المزيد من الأميال التي يمكن الحصول عليها من الإجابات الأخرى ، لكنني أعتقد أنني سأقوم بنشر ذلك على الأرجح لأنه يساعد شخص ما في نفس القارب.

تبدو إجابة ديفيد شميت وكأنها قد تصف السبب الأساسي.




وفقاً " نظرة عامة على Templating البيانات على MSDN" ، يجب استخدام DataTemplates كـ ItemTemplate لتعريف كيفية تقديم البيانات ، بينما سيتم استخدام Style كـ ItemContainerStyle إلى نمط فقط الحاوية التي تم إنشاؤها ، مثل ListBoxItem .

ومع ذلك ، يبدو أنك تحاول استخدام هذا الأخير للقيام بمهمة السابق. لا أستطيع إعادة إنشاء موقفك دون المزيد من التعليمات البرمجية ، ولكني أظن أن إجراء عملية ربط البيانات في نمط الحاوية يمكن أن يلقي مفتاحًا في الشجرة المرئية / المنطقية المفترضة.

لا يسعني أيضًا إلا أن أفكر في أن تنسيقًا مخصصًا للعناصر المستندة إلى معلومات العنصر يستدعي إنشاء Panel مخصصة. من الأفضل على الأرجح أن تقوم Panel المخصصة بتخطيط العناصر أكثر من العناصر التي تضع نفسها مع تشكيلة IValueConverters Goldberg من IValueConverters .




لقد واجهت نفس نوع الخطأ:

System.Windows.Data Error: 4: لا يمكن العثور على مصدر للارتباط مع المرجع 'RelativeSource FindAncestor، AncestorType =' System.Windows.Controls.ItemsControl '، AncestorLevel =' 1 ''. BindingExpression: مسار = HorizontalContentAlignment. DataItem = فارغة؛ عنصر الهدف هو 'ListBoxItem' (Name = '')؛ الخاصية الهدف هي "HorizontalContentAlignment" (اكتب "HorizontalAlignment")

حدث هذا أثناء القيام بربط مثل هذا:

<ListBox ItemsSource="{Binding Path=MyListProperty}"  />

إلى هذه الخاصية على كائن سياق البيانات الخاص بي:

public IList<ListBoxItem> MyListProperty{ get; set;}

بعد إجراء بعض التجارب ، اكتشفت أن الخطأ قد تم تشغيله فقط عندما تجاوز عدد العناصر الارتفاع المرئي لباب ListBox الخاص بي (على سبيل المثال عند ظهور أشرطة التمرير الرأسية). لذا فكرت على الفور في التمثيل الافتراضي وحاولت ذلك:

<ListBox ItemsSource="{Binding Path=MyListProperty}" VirtualizingStackPanel.IsVirtualizing="False" />

هذا حل المشكلة بالنسبة لي. وبالرغم من أنني كنت أفضّل تشغيل المحاكاة الافتراضية ، إلا أنني لم أستخدم مزيدًا من الوقت للتعمق فيها. طلبي هو قليلا على الجانب المعقد مع مستويات mulitiple من الشبكات ، لوحات قفص الاتهام وغيرها ، وبعض المكالمات أسلوب asynch. لم أتمكن من إعادة إنتاج المشكلة في تطبيق أبسط.




لقد بدأت في تشغيل هذه المشكلة ، على الرغم من أن مربع القائمة الخاص بي كان يحتوي على نمط ومجموعة ItemContainerStyle - وهذه الأنماط المسماة قد تم تعريفها بالفعل HorizontalContentAlignment. كنت أستخدم عناصر التحكم CheckBox لتشغيل / إيقاف التصفية المباشرة في ListBox ويبدو أن هذا يؤدي إلى سحب العناصر بدلاً من النمط الافتراضي بدلاً من الأنماط المخصصة. تحدث معظم الأخطاء في المرة الأولى التي يتم فيها تشغيل التصفية المباشرة ، ولكن بعد ذلك ستستمر في رمي خطأين في كل تغيير. أجد أنه من المثير للاهتمام أن التسجيلات 2 في مجموعتي كانت فارغة تمامًا ، وبالتالي لم يكن هناك أي شيء لعرضه في العنصر. لذلك يبدو أن هذا قد تم. أخطط لإنشاء بيانات افتراضية ليتم عرضها عندما يكون السجل فارغًا.

عمل اقتراح كارتر بالنسبة لي. إضافة نمط "افتراضي" منفصل بدون مفتاح و TargetType = "ListBoxItem" التي حددت الخاصية HorizontalContentAlignment تحل المشكلة. لم أكن حتى بحاجة إلى ضبط الخاصية OverridesDefaultStyle لذلك.






Links