2011-04-21 10 views
6

इस प्रश्न का हिस्सा how to bind to an enum as a command parameter पर उत्तर दिया गया है, लेकिन मुझे एक कदम आगे जाने की आवश्यकता है।कमांड पैरामीटर

मेरे पास एक डेटा टेम्पलेट है जो मेनू से लिंक करता है और प्रत्येक मेनू विकल्प enum के एक अलग मूल्य के साथ एक आदेश शुरू करता है। मैं यह कैसे करु? क्या मुझे बस एक स्ट्रिंग पास करने का सहारा लेना है?

public enum TestEnum 
{ 
    First, 
    Second, 
    Third 
} 
<DataTemplate> 
    <MenuItem Header="{Binding Path=.}" Command="{Binding ACommand}" 
     CommandParameter="{Binding Path=???}" /> 
</DataTemplate> 

मैं पहली बार MenuItem Enum.First, Enum.Second को एक दूसरे के लिए बाध्य करने के लिए, और इतने पर चाहते हैं। मैं यह लिखित चाहता हूं, ताकि मुझे प्रत्येक enum.value के लिए मेनू आइटम के बजाय मेनू में एक बार ऊपर डेटा टेम्पलेट लिखना पड़े। HTH।

मुझे प्रत्येक मेनू आइटम के लिए कमांड पैरामीटर की आवश्यकता है। तो मेरे पास पहले, दूसरे और तीसरे के 3 मेनू आइटम होंगे।

+0

आपके द्वारा बाध्य किए जाने वाले आइटमसोर्स क्या हैं? –

+0

क्या आप मेनू के लिए आइटम्ससोर्स के रूप में enum बाध्य करना चाहते हैं? और प्रत्येक मेनू Iemem enum आइटम के रूप में सेट करें? – Howard

+0

मेरा आइटम स्रोत मूल्यों की एक सूची है।मैं enum को आइटम के रूप में बाध्य करना चाहता हूं प्रत्येक मेनू के साथ स्रोत आइटम जिसमें एक enum है। – kevindaub

उत्तर

10

सुनिश्चित नहीं है कि मैं आपकी आवश्यकता को सही ढंग से समझता हूं ... क्या आप यही चाहते हैं?

CommandParameter="{Binding Path={x:Static local:TestEnum.First}}" 

संपादित करें: ठीक है, मुझे लगता है कि अब मैं समझ ... आप ItemsSource के रूप में enum मूल्यों चाहते हैं, आप एक ObjectDataProvider साथ यह कर सकता है, लेकिन वहाँ एक बेहतर तरीका है: एक मार्कअप विस्तार लिखने जो enum के प्रकार में लेता है और मूल्य देता है।

मार्कअप विस्तार

[MarkupExtensionReturnType(typeof(Array))] 
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) 
    { 
     return Enum.GetValues(EnumType); 
    } 
} 

XAML

<MenuItem ItemsSource="{my:EnumValues EnumType=my:TestEnum}" Name="menu"> 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding}" /> 
      <Setter Property="Command" Value="{Binding SomeCommand, ElementName=menu}" /> 
      <Setter Property="CommandParameter" Value="{Binding}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 
+1

मुझे लगता है कि वह enum मानों को मेनू के आइटम्ससोर्स के रूप में बाध्य करना चाहता है। – Howard

+0

मुझे लगता है कि आप जवाब दे रहे हैं, अगर मुझे लगता है कि छोड़कर, मैं कहूंगा कि daub815 अपने प्रत्येक मेनू ITems के लिए पूर्व निर्धारित एनम मान में गुजरना चाहता है। –

+0

मैं पूरी गणना में एक आइटम्स स्रोत के रूप में पास करना चाहता हूं और कमांड पैरामीटर गणना में प्रत्येक enum पर सेट किया जाएगा। – kevindaub

1
<ObjectDataProvider ObjectType="{x:Type sys:Enum}" MethodName="GetValues" x:Key="EnumProvider"> 
    <ObjectDataProvider.MethodParameters> 
     <x:TypeExtension Type="{x:Type local:TestEnum}" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

<!--Binding the resource as ItemsSource--> 
<Menu ItemsSource="{Binding Source={StaticResource EnumProvider}}" /> 

या

<Menu> 
    <MenuItem Header="TestEnum" ItemsSource="{Binding Source={StaticResource EnumProvider}}" > 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <MenuItem Header="{Binding Path=.}" Command="{Binding ACommand}" 
     CommandParameter="{Binding Path=???}" /> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 
1

मैं प्रत्येक मेनू आइटम एक enum होने के साथ ItemsSource के रूप में enum बाध्य करने के लिए चाहते हैं।

अपने ItemsSource enum ही है, तो आप सिर्फ CommandParameter="{Binding}" लिख सकते हैं और यह वर्तमान enum मूल्य पारित करेंगे।

5

आप एक पूर्व निर्धारित Enum मूल्य MenuItem के लिए पारित करने के लिए (जो यह लग रहा है जैसे आप करते हैं) चाहते हैं तो आप चाहते ऐसा करें ... (अपने xaml में xmlns:local="..." आयात करने के लिए सुनिश्चित करें)

<MenuItem ... CommandParameter="{x:Static local:TestEnum.First}" /> 

उदाहरण के लिए आपको कमांड पैरामीटर के लिए वास्तव में कुछ भी करने की आवश्यकता नहीं है (मुझे लगता है)। कमांड पैरामीटर के लिए एक मान बाध्यकारी का तात्पर्य है कि कमांड पैरामीटर का मान भिन्न हो सकता है और उस मान का स्रोत कहीं और, किसी अन्य तत्व की निर्भरता प्रॉपर्टी या डेटाकॉन्टेक्स्ट के भीतर एक सीएलआर मान पर मूल्य के रूप में होता है।

संबंधित मुद्दे