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


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.




ربما لم تكن هذه إجابة مفيدة ، لكني واجهت نفس المشكلة عند تغيير ترتيب الأعمدة وجعلت من الخطأ كما هو الحال في العينة التالية. وجود الكثير من الأعمدة ، أعدت ترتيبها ولصقها بطريقة ما بعد إغلاق العلامة / /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>

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







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

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



في حالتي ، لم يكن يستخدم 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>



لقد حدث هذا الخطأ عندما حاولت تطبيق قوائم السياق على 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}" جزء.