سؤال

لدي شبكة بها صف واحد فقط.أرغب في تحديد عدد الأعمدة حسب سياق بيانات الشبكة.

على سبيل المثال، إذا كانت لدي قائمة بالأسماء المعروضة في خاصية ObservableCollection تسمى "الأسماء" والتي تعرض "Fred" و"Joe" و"Anne"، فأنا أرغب في الحصول على ثلاثة أعمدة في الشبكة، كل منها به مربع نص مرتبط بكل منها اسم.

أفكاري حتى الآن:

1) أنشئ الشبكة يدويًا في الكود الخلفي وأعد بنائها عندما يتغير ObservableCollection.لم أوافق على هذا لأنه بدا قاسيًا بعض الشيء وليس طريقة WPF للقيام بالأشياء.

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

هل كانت مفيدة؟

المحلول

لا أعتقد أن تعديل الشبكة بسرعة هو أفضل رهان لك.وهنا حل آخر.يمكنك استخدام ListBox، ولكن استبدل ItemsPanel مع لوحة أخرى من اختيارك.لوحة العناصر الافتراضية لـ ListBox هي VirtualizingStackPanel مع تعيين الاتجاه على Vertical.نظرًا لأنك تريد عرض العناصر الخاصة بك أفقيًا، يمكنك استبدالها بـ VirtualizingStackPanel مع ضبط الاتجاه على أفقي.بالطبع، يمكنك تعديل ItemsTemplate أو أي شيء آخر كما تراه مناسبًا.

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

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

نصائح أخرى

إذا كان أ شبكة بيانات, ، ال إنشاء أعمدة تلقائية الملكية سوف تفعل هذا.باستخدام DataGridTemplateColumn, ، يمكنك وضع عناصر تحكم مربع النص بدلاً من النص فقط هناك.ستحتاج إلى تقديم حدث مرفق بـ AutoGeneratingColumn وفي AutoGeneratingColumnEventArgs (مرحبًا، Microsoft، هذا هو استدعاء نفق الكاربيل)، قم بتعيين خاصية العمود إلى عمود قالب يحتوي على مربع النص.

أود أن أقول إن طريقة ObservableCollection الخاصة بك أبسط ؛-P.

إذا كنت لا يمكن أن يقبل وجود أسماء في كل صف بدلا من كل عمود، يجب عليك استخدام يكون ListView مع GridView عرض الممتلكات، وCellTemplate المخصصة التي هو مجرد نص منضم. شيء من هذا القبيل:

<ListView ItemsSource="{Binding Names}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <!-- Your textbox goes in a DataTemplate here -->             
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

والحل رقم 2 هو للأسف غير ممكن في XAML. الحل رقم 1 هو أفضل رهان إذا كان يجب أن يكون كل اسم في العمود الخاص بها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top