2011-10-21 12 views
7

मेरे पास कई डेटाग्रिड्स के साथ एप्लिकेशन है और एक्सेल कमांड में निर्यात है, जो कमांड पैरामीटर के रूप में केंद्रित डाटाग्रिड को प्राप्त करता है। क्या कमांड पैरामीटर को फोकसमेनर को बाध्य करना संभव है। फोकस्ड एलिमेंट, या क्या मुझे उन्हें स्पष्टीकरण सेट करना है?FocusManager के लिए बाध्यकारी। फ़ोकसएलेमेंट

अग्रिम

उत्तर

7

हां, आप फोकस्ड एलीमेंट से जुड़ सकते हैं। की तरह कुछ:

<Button ... 
    CommandParameter="{Binding (FocusManager.FocusedElement), RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 

आपका ध्यान स्कोप के आधार पर आप एक और तत्व को विंडो को बदलने की जरूरत हो सकती है।

लेकिन व्यक्तिगत रूप से, मैं कमांड के हैंडलर को यह देखने के लिए सेटअप करता हूं कि पैरामीटर शून्य है या नहीं। यदि ऐसा है तो मैं प्रोग्रामेटिक रूप से FocusManager.FocusedElement प्राप्त करूंगा।

var element = parameter as DataGrid; 
if (element == null) 
    element = FocusManager.FocusedElement as DataGrid. 

आप संबंधित डेटाग्रिड प्राप्त करने के लिए आवश्यक दृश्य पेड़ को भी खोज सकते हैं।

+0

+1 का सबसे अच्छा विचार नहीं है। लेकिन कोड भाग के लिए, यदि मैं एमवीवीएम पैटर्न का पालन कर रहा हूं और मेरा कमांड मेरे व्यूमोडेल में रहता है, तो मुझे वहां से अपनी यूआई ऑब्जेक्ट्स तक नहीं पहुंचना चाहिए। सही? –

+1

@ आरवी 1 9 87- यदि आप इसे कमांड पैरामीटर के माध्यम से पास करते हैं तो आप अभी भी यूआई ऑब्जेक्ट तक पहुंच रहे हैं :) – CodeNaked

+0

एक्सएमएल दृष्टिकोण मेरे लिए काम नहीं करता है, लेकिन यह फ्लुएंट रिबन के साथ जारी हो सकता है जिसका मैं उपयोग करता हूं। दृष्टिकोण के पीछे कोड काम करता है, लेकिन आपको फ़ंक्शन GetFocusedElement का उपयोग करना होगा और इसे मुख्य विंडो के संदर्भ में पास करना होगा – Twelve

1

धन्यवाद आप अपने ViewModel पर CLR संपत्ति क्यों नहीं हो सकता "SelectedDataGrid" जो आप अद्यतन जब भी आपके डेटा ग्रिड के किसी भी फोकस हो जाता है का कहना है। बस अपने कोड से उस संपत्ति का उपयोग किया, इसे अपने दृश्य से गुजरने के बजाय।

+0

मैं प्रिज्म का उपयोग करता हूं और कई मॉड्यूल करता हूं, इसलिए मुझे इस प्रॉपर्टी को प्रत्येक व्यूमोडेल में जोड़ना होगा, जो निश्चित रूप से xaml दृष्टिकोण के लिए – Twelve