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


Answers

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

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

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

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

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

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

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

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')

هل يمكن لأي شخص أن يشرح ما يجري؟

أوه، وهنا بلدي زمل:

<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>




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

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




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

إذا قمت بإزالة أحد التصريحات 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>

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

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

يبدو جواب ديفيد شميت أنه قد يصف السبب الجذري.




هذا عمل بالنسبة لي. ضع هذا في ملف 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




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

System.Windows.Data خطأ: 4: لا يمكن العثور على مصدر للربط مع مرجع 'ريلاتيفسورس فيندانسستور، أنسيستورتيب =' System.Windows.Controls.ItemsControl '، أنسيستورليفيل =' 1 ''. BindingExpression: مسار = HorizontalContentAlignment. DataItem = فارغة؛ العنصر المستهدف هو 'ليستبوكسيتم' (نيم = '')؛ الهدف هو 'هوريزونتالكونتنتالينمنت' (اكتب 'أفقيالينمنت')

حدث هذا أثناء القيام ملزمة مثل هذا:

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

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

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

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

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

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




إذا كنت تريد أن تحل تماما محل قالب ListBoxItem بحيث لا يوجد اختيار مرئيا (ربما كنت تريد أن ننظر ItemsControl مع سلوك تجميع / الخ من ItemsControl ) ثم يمكنك استخدام هذا النمط:

<Style TargetType="ListBoxItem">
  <Setter Property="Margin" Value="2" />
  <Setter Property="FocusVisualStyle" Value="{x:Null}" />
  <Setter Property="OverridesDefaultStyle" Value="True" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ListBoxItem}">
        <ContentPresenter Content="{TemplateBinding ContentControl.Content}" 
                          HorizontalAlignment="Stretch" 
                          VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                          SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

هذا النموذج أيضا يستبعد المجمع Border القياسية. إذا كنت بحاجة إلى ذلك، يمكنك استخدام استبدال القالب مع هذا:

<Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
        Padding="{TemplateBinding Control.Padding}" 
        BorderBrush="{TemplateBinding Border.BorderBrush}" 
        Background="{TemplateBinding Panel.Background}" 
        SnapsToDevicePixels="True">
  <ContentPresenter Content="{TemplateBinding ContentControl.Content}" 
                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>

إذا كنت لا تحتاج إلى كل هذه القيم TemplateBinding ثم يمكنك إزالة بعض للأداء.