2010-04-18 16 views
18

के भीतर इनपुट बाइंडिंग को परिभाषित करना मैं एमवीवीएम डिज़ाइन पैटर्न का उपयोग करके एक WPF ऐप बना रहा हूं, और मैं टैबइटम नियंत्रण को विस्तारित करने का प्रयास कर रहा हूं ताकि जब उपयोगकर्ता मध्य माउस बटन पर क्लिक करता है तो वह टैब बंद कर देता है। मैं इनपुट बाइंडिंग का उपयोग करके इसे प्राप्त करने की कोशिश कर रहा हूं, और जब तक मैं इसे शैली में परिभाषित करने की कोशिश नहीं करता तब तक यह बहुत अच्छा काम करता है। मैंने सीखा है कि आप इनपुट बाइंडिंग को शैली में तब तक नहीं जोड़ सकते जब तक आप इसे निर्भरता प्रॉपर्टी का उपयोग करके संलग्न नहीं करते। तो मैंने इस समान पोस्ट here... का पालन किया और यह लगभग ... काम करता है। मैं मध्य माउस बटन का उपयोग करके एक टैब बंद कर सकता हूं, लेकिन यह किसी अन्य टैब पर काम नहीं करेगा (सभी टैब रनटाइम पर जोड़े जाते हैं और उसी शैली का उत्तराधिकारी होते हैं)।स्टाइल

तो मुझे कुछ मदद चाहिए। यह केवल पहली बार क्यों काम करेगा, और बाद में नहीं? जाहिर है, मैं एक कस्टम नियंत्रण बना सकता हूं जो टैबिटेम से विरासत में आता है और इसे काम करता है, लेकिन मैं इसे समझना चाहता हूं क्योंकि मैं इसे अपनी परियोजनाओं में विस्तारित कर सकता हूं। मैं निर्भरता प्रॉपर्टीज पर कोई विशेषज्ञ नहीं हूं, इसलिए कृपया मेरी मदद करें। धन्यवाद!

शैली:

<Style TargetType="{x:Type TabItem}"> 
    <Setter Property="w:Attach.InputBindings"> 
     <Setter.Value> 
      <InputBindingCollection> 
       <MouseBinding MouseAction="MiddleClick" 
           Command="{Binding CloseCommand}"/> 
      </InputBindingCollection> 
     </Setter.Value> 
    </Setter> 
    ... 
</Style> 

कक्षा

public class Attach 
{ 
    public static readonly DependencyProperty InputBindingsProperty = 
     DependencyProperty.RegisterAttached("InputBindings", typeof(InputBindingCollection), typeof(Attach), 
     new FrameworkPropertyMetadata(new InputBindingCollection(), 
     (sender, e) => 
     { 
      var element = sender as UIElement; 
      if (element == null) return; 
      element.InputBindings.Clear(); 
      element.InputBindings.AddRange((InputBindingCollection)e.NewValue); 
     })); 

    public static InputBindingCollection GetInputBindings(UIElement element) 
    { 
     return (InputBindingCollection)element.GetValue(InputBindingsProperty); 
    } 

    public static void SetInputBindings(UIElement element, InputBindingCollection inputBindings) 
    { 
     element.SetValue(InputBindingsProperty, inputBindings); 
    } 
} 
+0

मैंने डैनियल द्वारा सुझाए गए कोड के साथ ऊपर वर्णित सटीक समस्या में भाग लिया है। ऐसा लगता है कि अटैच क्लास का उपयोग करते समय विशेष रूप से शैली में कुछ अजीब बात है। मैंने पाया कि डेटाकॉन्टेक्स्ट शून्य "कभी-कभी" था जब इनपुट बाइंडिंग जोड़े गए थे, इसलिए बाध्यकारी होने पर यह आदेशों का पता नहीं लगा सका। मुझे कभी समाधान नहीं मिला लेकिन मैंने नीचे दिए गए जवाब में बाइंडिंग को डुप्लिकेट कर दिया। – Asheh

उत्तर

14

कोई बात नहीं, मैं इसे बाहर अपने आप को लगा। मैंने उपरोक्त अटैच क्लास का उपयोग भी नहीं किया ... इसके बजाय मैंने टैबइटेम (जो एक सीमा है) के लिए ControlTemplate पर इनपुट बाइंडिंग का उपयोग किया, इसलिए ऐसा कुछ देखा ... मुझे नहीं पता कि मैंने क्यों नहीं सोचा इसकी पहली जगह .. :)

<ControlTemplate TargetType="{x:Type TabItem}"> 
    <Grid SnapsToDevicePixels="true"> 
     <Border x:Name="Bd" ...> 
      <DockPanel> 
       ... 
      </DockPanel> 
      <Border.InputBindings> 
       <MouseBinding MouseAction="MiddleClick" 
           Command="{Binding CloseCommand}"/> 
      </Border.InputBindings> 
     </Border> 
    </Grid> 
    ... 
</ControlTemplate> 
+0

मुझे यह समाधान पसंद नहीं है क्योंकि मुझे बनाए गए किसी भी टेम्पलेट को ओवरराइड करना है ... –

14

आपकी कक्षा "अटैच" मेरे लिए ठीक काम करती है! किसी की जरूरत है, चाल इस तरह उपयोग शैली है, एक्स के साथ: साझा संशोधक:

<InputBindingCollection x:Key="inputCollection" x:Shared="False"> 
     <KeyBinding Key="Del" Command="{Binding DeleteItemCommand}"/> 
</InputBindingCollection> 

<Style TargetType="{x:Type TabItem}"> 
    <Setter Property="w:Attach.InputBindings" Value="{StaticResource inputCollection}" /> 
    ... 
</Style> 

धन्यवाद!

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