كيفية إنشاء اثنين من التسلسل الهرمي datateMplates اللذين مرجعان للطرفين في Silverlight؟
-
25-09-2019 - |
سؤال
بشرط:
- لا يمكن تعيين datatemplates بواسطة TargetType
- يمكن أن تشير مراجع StaticResource فقط من قبل
كيف يمكن أن يكون قالب واحد الموقف التالي في TreeView؟
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
هذا الهيكل يفسح المجال لشجرة ستبدو:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
هذا من شأنه تافهة إلى القالب في WPF بسبب TargetType
ممتلكات HierarchicalDataTemplate
. في Silverlight ، سيتعين علينا أن نفعل شيئًا أكثر مثل:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
من الواضح أنه لا يمكن أن يعمل بسبب ResourceTemplate
لا يمكن الرجوع PropertyTemplate
لأنه تم تعريفه بعده في مستند XAML. لذا ، كيف تحل مشكلة الدجاج والبيئة؟
المحلول
الحل المعقول الوحيد الذي وجدته هو إنشاء نوع ثالث من العرض الذي يلف أيًا من النوعين الأولين (الموارد أو الممتلكات) وتوفير خصائص شائعة لربط: (مثل الأطفال). هذا لا يزال ليس مثاليًا للغاية ، إذا كان النوعان بحاجة إلى قوالب مختلفة جدًا لأنني في هذه المرحلة ، أستخدم VisualStateManager
للتبديل بين القوالب للبيانات.
<HierarchicalDataTemplate x:Key="TreeItemTemplate"
ItemSource="{Binding Children}">
<ContentPresenter Content="{Binding}">
<VisualStateManager.Groups>
<VisualStateGroup>
<VisualState Name="IsResource">
<!-- set resource template -->
</VisualState>
<VisualState Name="IsProperty">
<!-- set property template -->
</VisualState>
</VisualStateGroup>
</VisualStateManager.Groups>
</ContentPresenter>
</HierarchicalDataTemplate>
لا تنتمي إلى StackOverflow