में घिरे एनम पर बाध्यकारी मैं कक्षा के एक enum टाइप की गई संपत्ति के लिए एक combobox बाध्यकारी के साथ पागल हो रहा है, जहां enum खुद को उसी कक्षा में घोषित किया जाता है।एक कॉम्बोबॉक्स को एक कक्षा
मैं यहां दिए गए उत्तर का पालन करने की कोशिश कर रहा हूं (wpf combobox binding to enum what i did wrong?) विशेष रूप से मैं सुझाए गए मार्कअप एक्सटेंशन कोड और मिलान करने वाले xaml कोड का उपयोग कर रहा हूं।
मेरे काम कर कोड है:
एक अलग फाइल में Enum को परिभाषित करना।
namespace EnumTest
{
public enum TestEnum {one, two, three, four };
}
कक्षा Enum का उपयोग करता है (ध्यान दें कि PropertyChanged कोड चीजों को आसान बनाने के हटा दिया गया है): के लिए
namespace EnumTest
{
public partial class Window1 : Window
{
Test _oTest = new Test();
public Window1()
{
InitializeComponent();
cmbBox.DataContext = _oTest;
}
}
}
एक्सटेंशन विधि: वर्ग का उपयोग करता है
namespace EnumTest
{
public class Test : INotifyPropertyChanged
{
private TestEnum _MyVar;
public TestEnum MyVar {
get { return _MyVar; }
set
{
_MyVar = value;
OnPropertyChanged("MyVar");
}
}
public Test()
{
_MyVar = TestEnum.three;
}
}
}
कार्यक्रम फ़ाइल एनम
namespace EnumTest
{
[MarkupExtensionReturnType(typeof(object[]))]
public class EnumValuesExtension : MarkupExtension
{
public EnumValuesExtension()
{
}
public EnumValuesExtension(Type enumType)
{
this.EnumType = enumType;
}
[ConstructorArgument("enumType")]
public Type EnumType { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (this.EnumType == null)
throw new ArgumentException("The enum type is not set");
return Enum.GetValues(this.EnumType);
}
}
}
प्रदर्शित करना
और उस डेटा प्रदर्शित किया जाता है XAML कोड:
<Window x:Class="EnumTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:w="clr-namespace:EnumTest"
Title="Window1" Height="300" Width="300">
<Grid>
<ComboBox Name="cmbBox"
Height="20"
Width="80"
ItemsSource="{Binding Source={w:EnumValues EnumType=w:TestEnum}}"
SelectedItem="{Binding Path=MyVar}"
/>
</Grid>
</Window>
ऊपर
सभी अच्छे और dandy है, लेकिन मैं पर परिभाषित किया जा रहा से टेस्ट वर्ग भीतर Enum को परिभाषित करने और Enum खाई करने के लिए चाहते हैं वैश्विक कार्यक्षेत्र। इसलिए जैसा:
namespace EnumTest
{
public class Test : INotifyPropertyChanged
{
// Declare Enum **INSIDE** the class
public enum TestEnum {one, two, three, four };
private TestEnum _MyVar;
public TestEnum MyVar {
get { return _MyVar; }
set
{
_MyVar = value;
OnPropertyChanged("MyVar");
}
}
public Test()
{
_MyVar = TestEnum.three;
}
}
}
तो सवाल मैं जा रहा है के रूप में मिलान XAML वाक्य रचना की ओर संकेत करने के लिए भेजा:
<ComboBox Name="cmbBox"
...
ItemsSource="{Binding Source={w:EnumValues EnumType=w:Test+TestEnum}}"
...
/>
लेकिन इस (एक तरह से) मेरे लिए काम नहीं करता। मैं जब मैं एक साफ निर्माण करना एक 2008 वी.एस. स्थिति पट्टी पर संदेश "सफल बनाएँ", लेकिन मैं यह भी एक त्रुटि XAML
Type 'Test+TestEnum' was not found.
में रिपोर्ट की जा रही लेकिन कोड की उम्मीद रन के रूप में मिलता है!
हालांकि इसका मतलब है कि xaml डिजाइनर लोड नहीं होगा। इसलिए जब तक मैं xaml त्रुटि को साफ़ नहीं कर सकता, तब तक मैं और अधिक wpf काम करने में खराब हूं।
अब मैं सोच रहा हूं कि यह एक वीएस 2008 एसपी 1 मुद्दा है, और मेरे हिस्से पर कोई समस्या नहीं है।
संपादित
- मेरी समस्या बयान अधिक स्पष्ट किए गए।
- जोएल के 1 समाधान की कोशिश की, लेकिन मैं और 2 XAML त्रुटियों
- की कोशिश की जोएल के 2 समाधान चलाते कोड के साथ समाप्त हो गया और कहा कि सीधे बॉक्स से बाहर काम किया - तो मुझे लगता है कि एक के साथ जा रहा हूँ!
नोट्स तो सवाल यह है कि मैं XAML के लिए वाक्य रचना की इस शैली का उपयोग करता है से MarkupExtension कोड मिला:
<ComboBox ItemsSource="{w:EnumValues w:TestEnum}"/>
जब मैं का उपयोग करें कि मैं कह रही है कि एक संकलन त्रुटि मिलती है कोई EnumValues कन्स्ट्रक्टर 1 पैरामीटर लेता है। मैंने कुछ googling किया और यह वीएस में एक त्रुटि प्रतीत होता है। मैं वीएस 2008 एसपी 1 का उपयोग कर रहा हूँ। मैंने कुछ टिप्पणियां देखीं जो वीएस 2010 बीटा में होने वाली थीं। वैसे भी, यही कारण है कि मैं
<ComboBox ItemsSource="{w:EnumValues EnumType=w:TestEnum}"/>
के xaml वाक्यविन्यास का उपयोग करता हूं क्योंकि यह वाक्यविन्यास काम करता है!
कन्स्ट्रक्टर के बारे में त्रुटि के संबंध में, यह केवल डिजाइनर में होता है।यह अन्यथा ठीक काम करना चाहिए। इस त्रुटि से बचने के लिए, एक अलग असेंबली –
@ थॉमस में मार्कअप एक्सटेंशन को परिभाषित करें: मैं भूल गया था कि डिज़ाइनर किस तरह से/कहां और कैसे इसे तुरंत चालू करता है, उसके बारे में कैंसर के बारे में बता सकता है। –
@ जोएल - और नौसिखिया wpf प्रोग्रामर इस तरह की बात कैसे जानते हैं? निर्माण उपकरण के एक हिस्से को संतुष्ट करने के लिए एक अलग असेंबली में कक्षा को रखने के बारे में जानना असंभव IMHO है। लेकिन जब तक मुझे उचित समझ नहीं मिलती तब तक मैं उस पर नाराज रहूंगा। एक बार फिर धन्यवाद। –