आप DataGridTextColumn
क्योंकि DataGridTextColumn
FrameworkElement
(या FrameworkContentElement
) से निकाले जाते हैं नहीं है शैली नहीं दे सकते। केवल फ्रेमवर्क एलिमेंट, आदि स्टाइल का समर्थन करता है।
जब आप किसी भी प्रकार के लिए XAML में शैली बनाने का प्रयास करते हैं जो FrameworkElement
या FrameworkContentElement
नहीं है तो आपको वह त्रुटि संदेश मिलता है।
आप इसे कैसे हल करते हैं? किसी भी समस्या के साथ, जहां इच्छा है वहां एक रास्ता है। इस मामले में मुझे लगता है कि सबसे आसान समाधान डेटा ग्रिड एक DataGridColumn शैली आवंटित करने के लिए के लिए एक संलग्न संपत्ति बनाने के लिए है:
public class MyDataGridHelper : DependencyObject
{
// Use propa snipped to create attached TextColumnStyle with metadata:
... RegisterAttached("TextColumnStyle", typeof(Style), typeof(MyDataGridHelper), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var grid = (DataGrid)obj;
if(e.OldValue==null && e.NewValue!=null)
grid.Columns.CollectionChanged += (obj2, e2) =>
{
UpdateColumnStyles(grid);
}
}
}
private void UpdateStyles(DataGrid grid)
{
var style = GetTextColumnStyle(grid);
foreach(var column in grid.Columns.OfType<DataGridTextColumn>())
foreach(var setter in style.Setters.OfType<Setter>())
if(setter.Value is BindingBase)
BindingOperations.SetBinding(column, setter.Property, setter.Value);
else
column.SetValue(setter.Property, setter.Value);
}
}
तरीका यह काम करता है:
<DataGrid ...>
<local:MyDataGridHelper.TextColumnStyle>
<Style TargetType="FrameworkElement">
... setters here ...
</Style>
</local:MyDataGridHelper.TextColumnStyle>
...
कार्यान्वयन इन पंक्तियों के साथ कुछ होगा , किसी भी समय संलग्न संपत्ति बदल दी जाती है, कॉलम के लिए एक हैंडलर जोड़ा जाता है। ग्रिड पर चयन परिवर्तन घटना। जब संग्रहChanged घटना आग लगती है, सभी कॉलम सेट की गई शैली के साथ अद्यतन कर रहे हैं।
ध्यान दें कि उपरोक्त कोड उस स्थिति को संभाल नहीं करता है जहां एक शैली को हटाया जाता है और फिर से जोड़ा जाता है: दो ईवेंट हैंडलर पंजीकृत होते हैं। वास्तव में एक मजबूत समाधान के लिए आप ईवेंट हैंडलर युक्त एक और संलग्न संपत्ति जोड़कर इसे ठीक करना चाहते हैं ताकि ईवेंट हैंडलर को अनियंत्रित किया जा सके, लेकिन आपके उद्देश्य के लिए मुझे लगता है कि यह महत्वहीन है।
यहां एक और चेतावनी यह है कि सेटबाइंडिंग और सेटवैल्यू का सीधा उपयोग निर्भरता प्रॉपर्टी को के बजाय Local
का बेसवेल्यूसोर्स का कारण बन जाएगा। इससे शायद आपके मामले में कोई फर्क नहीं पड़ता लेकिन मैंने सोचा कि मुझे इसका जिक्र करना चाहिए।
स्रोत
2010-04-14 20:38:54
क्या रे का समाधान आपके लिए काम करता था? अगर ऐसा होता तो मुझे कुछ नमूना कोड देखना अच्छा लगेगा। जिस भाग में मुझे यहां नहीं मिलता है वह यह है कि स्टाइल के लिए टार्गेट टाइप फ्रेमवर्क एलिमेंट है, तो उदाहरण के लिए, आप CanUserSort = False जैसी संपत्ति कैसे सेट कर सकते हैं? चीयर्स – Berryl
यहां एक और तरीका है ... http://stackoverflow.com/questions/21982526/show-missing-part-of-text-in-datagrid-textbox-wpf –