XAML

2009-06-19 9 views
6

में कमांड लक्ष्य सेट करना मुझे रूटेड कॉमांड के लिए कमांडटाइटल प्रॉपर्टी को समझने में कठिनाई हो रही है।XAML

असल में, मेरे पास कुछ स्थिर आदेश हैं जिनके पास उपयोगकर्ता नियंत्रण में कार्यान्वयन है (खिड़की नहीं)। मैं उपयोगकर्ता नियंत्रण में एक कमांडबाइंडिंग बनाते हैं। अगर मैं usercontrol में बटन घोषित करता हूं, तो मैं अपने रूटेड ईवेंट का उपयोग करने में सक्षम हूं। हालांकि, जब बटन उपयोगकर्ता नियंत्रण से बाहर होता है, तो मैं अपने रूटेड ईवेंट का उपयोग नहीं कर सकता। मुझे लगता है कि कमांड लक्ष्य मेरी समस्या का समाधान करेगा।

तो मैं टूलबार उपयोगकर्ता नियंत्रण के बटन के लिए कमांडटाइटल कैसे सेट करूं, ताकि कंटेनर के निष्पादित और CanExecuted को कॉल किया जा सके?

माइयाहटन परिवर्तनों में परिवर्तन के साथ संपादित कोड, लेकिन मैं अभी भी इसे CanExecute या निष्पादित नहीं कर सकता।

विंडो XAML:

<Window x:Class="RoutedCommands.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:RoutedCommands" 
    xmlns:toolbar="clr-namespace:RoutedCommands.Toolbar" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <local:Container Width="100" Height="25" x:Name="MyContainer" /> 
     <toolbar:Toolbar Width="100" Height="25" CommandTarget="{Binding MyContainer}" /> 
    </StackPanel> 
</Window> 

टूलबार XAML:

<UserControl x:Class="RoutedCommands.Toolbar.Toolbar" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:RoutedCommands" 
    x:Name="MyToolbar" 
    Height="300" Width="300"> 
    <Grid> 
     <Button Command="{x:Static local:Commands.MyCommand}" Content="Try Me" CommandTarget="{Binding ElementName=MyToolbar, Path=CommandTarget, Mode=OneWay}" /> 
    </Grid> 
</UserControl> 

टूलबार सीएस:

public partial class Toolbar : UserControl 
    { 
     public Toolbar() 
     { 
      InitializeComponent(); 
     } 

     // Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty CommandTargetProperty = 
       DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(Toolbar), new UIPropertyMetadata(null)); 

     public IInputElement CommandTarget 
     { 
      get { return (IInputElement)GetValue(CommandTargetProperty); } 
      set { SetValue(CommandTargetProperty, value); } 
     } 
    } 

कंटेनर XAML:

<UserControl x:Class="RoutedCommands.Container" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:RoutedCommands" 
    Height="300" Width="300"> 
    <UserControl.CommandBindings> 
     <CommandBinding Command="{x:Static local:Commands.MyCommand}" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> 
    </UserControl.CommandBindings> 
    <Grid> 
     <Button Command="{x:Static local:Commands.MyCommand}" Content="Click Me" /> 
    </Grid> 
</UserControl> 

कंटेनर सीएस:

public partial class Container : UserControl 
{ 
    public Container() 
    { 
     InitializeComponent(); 
    } 

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     Console.WriteLine("My Command Executed"); 
    } 

    private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     Console.WriteLine("My Command Can Execute"); 
     e.CanExecute = true; 
    } 
} 

RoutedCommands:

namespace RoutedCommands 
{ 
    public static class Commands 
    { 
     public static readonly RoutedUICommand MyCommand = new RoutedUICommand(); 
    } 
} 
+0

मैं अभी तक अपने प्रश्न का उत्तर प्राप्त करने में सक्षम नहीं किया गया है, लेकिन मैं कर रहा हूँ मेरे पास अब तक जो काम है, उसके साथ काम करने की कोशिश कर रहा हूं। – kevindaub

+0

कुछ कोड पोस्ट किया गया है जो आपके परिदृश्य को काम पर ले जाना चाहिए। – micahtan

+0

यह वास्तव में मदद नहीं की थी। मैं आज रात कुछ और कोशिश करूँगा। – kevindaub

उत्तर

7

आप CommandTargets उपयोग करना चाहते हैं, मैं अपने कस्टम UserControl, जिस तरह से यह ButtonBase पर परिभाषित किया है के समान पर एक CommandTarget DependencyProperty पैदा करेगा।

ऐसा करने के बाद, अपने बटन के कमांड लक्ष्य को अपने कस्टम UserControl के कमांड लक्ष्य पर सेट करें।

संपादित करें: कोड नमूना

रूडी की टिप्पणी मान्य अगर आप एक MVVM वास्तुकला कर रहे हैं - RelayCommands या लिपटे प्रतिनिधियों का एक अन्य स्वरूप उस मामले में अच्छी तरह से काम करते हैं। आपके कोड नमूने के आधार पर, ऐसा नहीं लगता था कि आप उस दृष्टिकोण का उपयोग कर रहे थे, इसलिए मेरी मूल टिप्पणी।

कोड के लिए, आपको केवल अपनी टूलबार कक्षा को बदलने की आवश्यकता है। यह RoutedUICommand से आपकी MyCommand क्लास विरासत मानता है। यहाँ XAML है:

<UserControl 
    x:Class="WPFCommandTarget.CustomToolBar" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WPFCommandTarget" 
    x:Name="theControl"> 
    <Grid> 
     <Button 
      x:Name="theButton" 
      Command="{x:Static local:Commands.MyCommand}" 
      CommandTarget="{Binding ElementName=theControl, Path=CommandTarget, Mode=OneWay}" 
      Content="Try Me" /> 
    </Grid> 
</UserControl> 

और यहाँ कोड-पीछे है:

System.Windows उपयोग करते हुए; System.Windows.Controls का उपयोग कर ;

namespace WPFCommandTarget 
{ 
    /// <summary> 
    /// Interaction logic for CustomToolBar.xaml 
    /// </summary> 
    public partial class CustomToolBar : UserControl 
    { 
     public CustomToolBar() 
     { 
      InitializeComponent(); 
     } 

     public IInputElement CommandTarget 
     { 
      get { return (IInputElement)GetValue(CommandTargetProperty); } 
      set { SetValue(CommandTargetProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty CommandTargetProperty = 
      DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(CustomToolBar), new UIPropertyMetadata(null)); 
    } 
} 

कृपया ध्यान दें कि मैंने अपनी परीक्षा परियोजना में कुछ वर्ग नाम/नामस्थान बदल दिए हैं। आपको अपनी आवश्यकताओं के अनुरूप उन्हें बदलना होगा।

+0

क्या आप एक छोटा कोड नमूना या कुछ दिशा प्रदान कर सकते हैं? – kevindaub

1

क्या आपने रिलेकॉमैंड या डेलेगेट कमांड का उपयोग करने के लिए माना है! आपकी आवश्यकता के मुताबिक आपकी शक्ति अधिक उपयुक्त हो सकती है?

RelayCommand उपयोग करने का एक उदाहरण के लिए, जोश

द्वारा this लेख को पढ़ने के

ब्रायन नॉयेस भी एक उत्कृष्ट लेख उपलब्ध here

+0

DelegateCommand? क्या नेट या एक ऐड का वह हिस्सा है? – kevindaub

+0

@rudigrobler - क्या आप वाकई इस उदाहरण में रिलेकॉमैंड काम करेंगे? उनके कोड उदाहरण में कंटेनर और टूलबार को भाई बहन के रूप में उनके बीच कोई रेफरी नहीं है। – micahtan

+0

रिले/प्रतिनिधिमंडल ढांचे का हिस्सा नहीं हैं ... इसे जोश के लेख से प्राप्त करें या प्रिज्म डाउनलोड करें! रिले/प्रतिनिधिमंडल कमांड पेड़ पर भरोसा नहीं करते हैं ... आप प्रत्येक कमांड को निष्पादित करने के लिए एक प्रतिनिधि देते हैं और यह है ... – rudigrobler