बदलता है तो यहाँ XAML है कि मेरे पास है:WPF: पुन: लागू DataTemplateSelector जब एक निश्चित मूल्य
public class ListTemplateSelector : DataTemplateSelector {
public DataTemplate GroupTemplate { get; set; }
public DataTemplate ItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
GroupList<Person> list = item as GroupList<Person>;
if (list != null && !list.IsLeaf)
return GroupTemplate;
return ItemTemplate;
}
}
GroupTemplate डेटा टेम्पलेट के अंदर ही ListTemplateSelector का संदर्भ:
<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
यहाँ मेरी ListTemplateSelector वर्ग है , इसलिए मैंने स्थापित किया है जैसे मैंने इसे स्थापित किया है। यह एकमात्र रिकर्सिव हैक मैं एक साथ रख सकता हूं। लेकिन यह मेरी समस्या नहीं है।
मेरी समस्या यह है कि, IsLeaf संपत्ति में परिवर्तन होने पर मैं आइटम टेम्पलेट से GroupTemplate में बदलना चाहता हूं। यह पहली बार खूबसूरती से काम करता है क्योंकि यह पहली बार संपत्ति को पढ़ता है। लेकिन एक बार यह संपत्ति बदल जाती है, तो टेम्पलेट चयनकर्ता को पुनः प्राप्त नहीं किया जाता है। अब, मैं मूल्य से जुड़ने के लिए ट्रिगर्स का उपयोग कर सकता हूं और आइटम टेम्पलेट को उचित रूप से सेट कर सकता हूं, लेकिन मुझे प्रत्येक आइटम के लिए एक अलग टेम्पलेट सेट करने में सक्षम होना चाहिए, क्योंकि वे एक अलग राज्य में हो सकते हैं।
समूह 1::
उदाहरण के लिए, मैं एक समूह के इस तरह सूची है कहना IsLeaf = false, = GroupTemplate
समूह तो टेम्पलेट 2: IsLeaf = सच है, तो टेम्पलेट = ItemTemplate
समूह 3: IsLeaf = false है, तो टेम्पलेट = GroupTemplate
और एक बार समूह 1 के IsLeaf गुण परिवर्तन को सही पर, templat ई को आइटम टेम्पलेट में स्वचालित रूप से बदलने की जरूरत है।
संपादित करें:
यहाँ मेरी अस्थायी समाधान है। ऐसा करने का कोई बेहतर तरीका?
<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{DynamicResource ItemTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
स्पष्टता के लिए, क्या आपने ट्रिगर के पक्ष में DataTemplateSelector दृष्टिकोण को त्याग दिया था, या आपने ट्रिगर को डेटा टेम्पलेट चयनकर्ता के साथ समाधान में भी काम किया था? – alastairs
@ एलास्टेयर मैं ओपी के लिए बात नहीं कर सकता, लेकिन ट्रिगर्स डेटा टेम्पलेट चयनकर्ता को अनावश्यक बनाते हैं। – piedar