[.net] "يجب أن تكون مجموعة العناصر فارغة قبل استخدام ItemsSource."



6 Answers

كان لي هذا الخطأ نفسه لفترة من الوقت في سيناريو مختلف قليلا. كان لدي

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGridTextColumn 
        Header="Account Name" 
        Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>

التي أصلحت لتكون

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGrid.Columns>
        <wpftoolkit:DataGridTextColumn 
            Header="Account Name" 
            Binding="{Binding Path=AccountName}" />
    </wpftoolkit:DataGrid.Columns>
</wpftoolkit:DataGrid>
Question

أحاول الحصول على عرض الصور في WPF ListView على غرار WrapPanel كما هو موضح في مقالة ATC Avalon Team القديمة هذه: كيفية إنشاء طريقة عرض مخصصة .

عند محاولة تعبئة ListView مع مجموعة من الاستعلامات LINQ-Ent-Entities كائنات ADO.NET Entity Framework أحصل على الاستثناء التالي:

استثناء

يجب أن تكون مجموعة العناصر فارغة قبل استخدام ItemsSource.

رمز بلدي…

البصرية الأساسية

Private Sub Window1_Loaded(...) Handles MyBase.Loaded
    ListViewImages.ItemsSource = From g In db.Graphic _
                                 Order By g.DateAdded Ascending _
                                 Select g
End Sub

XAML

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <local:ImageView />
</ListView>

أضع نقطة توقف على هذا الخط. ListViewImages.ItemsSource هو Nothing قبل تعيين LINQ.




لقد حدث هذا الخطأ عندما حاولت تطبيق قوائم السياق على TreeView بي. انتهت تلك المحاولات في XAML سيئة التي جمعت بطريقة أو بأخرى:

<TreeView Height="Auto" MinHeight="100"  ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}" 
    ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
    ContextMenu="">
    <TreeView.ItemContainerStyle>
    ...  

لاحظ الخط إشكالية: ContextMenu=""> .
لا أعلم لماذا تم تجميعها ، لكنني حسبت أنه من الجدير بالذكر كسبب لرسالة الاستثناء المبهمة هذه. مثل Armentage قال ، انظر حول XAML بعناية ، خاصة في الأماكن التي قمت بتحريرها مؤخرًا.




استثناء

يجب أن تكون مجموعة العناصر فارغة قبل استخدام ItemsSource.

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

<!--Right-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <ItemsControl.ItemsPanel.../>
     <ItemsControl.MyAttachedProperty.../>
     <FrameworkElement.ActualWidth.../>
</ItemsControl>


<!--WRONG-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <Grid.../>
     <Button.../>
     <DataTemplate.../>
     <Heigth.../>
</ItemsControl>

أثناء تعيين ItemsControl.ItemsSource بالفعل من خلال Binding ، لا يمكن إضافة عناصر أخرى (الشبكة ، الزر ، ...) إلى المصدر. ومع ذلك ، بينما لا تكون ItemsSource قيد الاستخدام ، يُسمح بالرمز التالي:

<!--Right-->
<ItemsControl>
     <Button.../>
     <TextBlock.../>
     <sys:String.../>
</ItemsControl>

لاحظ المفقودين ItemsSource="{Binding MyItems}" جزء.




ربما لم تكن هذه إجابة مفيدة ، لكني واجهت نفس المشكلة عند تغيير ترتيب الأعمدة وجعلت من الخطأ كما هو الحال في العينة التالية. وجود الكثير من الأعمدة ، أعدت ترتيبها ولصقها بطريقة ما بعد إغلاق العلامة / /DataGrid.Columns :

       <DataGridTemplateColumn x:Name="addedDateColumn" Header="Added Date" Width="SizeToHeader">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=AddedDate}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
            <DataGridTemplateColumn x:Name="rowguidColumn" Header="rowguid" Width="SizeToHeader">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=rowguid}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
    </DataGrid>

على أي حال ، خسر نصف ساعة بسبب هذا. آمل أن يساعد هذا الآخرين.




في حالتي ، لم يكن يستخدم DataTemplate لـ ItemsControl.

قديم:

<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
    <StackPanel Orientation="Horizontal">
        <TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
        <Label Content="{Binding Path=Property2}"/>
    </StackPanel>
</ItemsControl>

الجديد:

<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
                <Label Content="{Binding Path=Property2}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>






أنا أيضا على سيناريو مختلف.

<ComboBox Cursor="Hand" DataContext="{Binding}"  
              FontSize="16" Height="27" ItemsSource="{Binding}" 
              Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">

        <DataTemplate>
            <TextBlock DataContext="{Binding}">
                <TextBlock.Text>
                  <MultiBinding StringFormat="{}{0} / {1}">
                    <Binding Path="MemberName"/>
                    <Binding Path="Phone"/>
                  </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>

</ComboBox>

الآن عندما تكمل العلامة المفقودة Control.ItemTemplate ، يصبح كل شيء طبيعيًا:

<ComboBox Cursor="Hand" DataContext="{Binding}"  
              FontSize="16" Height="27" ItemsSource="{Binding}" 
              Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock DataContext="{Binding}">
                <TextBlock.Text>
                  <MultiBinding StringFormat="{}{0} / {1}">
                    <Binding Path="MemberName"/>
                    <Binding Path="Phone"/>
                  </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    <ComboBox.ItemTemplate>
</ComboBox>



Related