2010-12-01 9 views
12

Sono perplesso su ciò che deve essere sicuramente uno dei requisiti WPF più comuni. Ho letto this question ma la mia implementazione della soluzione non funziona.Impostazione della messa a fuoco su un controllo all'interno di un oggetto ControlTemplate (parte 2)

Ecco il markup per il controllo lookless:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:WpfTest"> 
    <Style TargetType="{x:Type local:CustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
      <Border> 
      <TextBox x:Name="myTextBox" /> 
      </Border> 
      <ControlTemplate.Triggers> 
      <Trigger Property="IsFocused" 
        Value="True"> 
       <Setter Property="FocusManager.FocusedElement" 
         Value="{Binding ElementName=myTextBox}" /> 
       <Setter TargetName="myTextBox" 
         Property="Background" 
         Value="Green" /> 
      </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Ecco il markup per la finestra che contiene un'istanza del CustomControl:

<Window x:Class="WpfTest.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfTest" 
     Title="Window1" Height="300" Width="300"> 

    <local:CustomControl x:Name="CCtl" /> 
</Window> 

Ed ecco il code-behind:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     Loaded += (RoutedEventHandler)delegate { CCtl.Focus(); }; 
    } 
} 

Quando viene caricato Window1, la casella di testo diventa verde (a indicare che il trig ger funziona) ma l'attenzione rimane con CCtl e non con la casella di testo. Senza dubbio questo ha a che fare con l'uscita che visualizza il seguente errore di dati:

Cannot find source for binding with reference 'ElementName=myTextBox'. BindingExpression:(no path); DataItem=null; target element is 'CustomControl' (Name='CCtl'); target property is 'FocusedElement' (type 'IInputElement').

Non ho idea del perché questo errore sta comparendo. Qualsiasi suggerimento ricevuto con gratitudine, grazie.

risposta

12

Provare a utilizzare questo per il vostro trigger invece:

<Trigger Property="IsFocused" Value="True"> 
    <Setter TargetName="myTextBox" Property="FocusManager.FocusedElement" Value="{Binding ElementName=myTextBox}" /> 
</Trigger> 

L'errore che si sta dicendo che non può individuare myTextBox perché il nome non è nel campo di applicazione in cui viene applicata la proprietà FocusedElement. In questo caso si trova nell'istanza CCtl stessa, che non può vedere all'interno del proprio modello. Impostando la proprietà su qualcosa all'interno del modello, Binding può individuare l'elemento denominato.

+0

Sì, è così, grazie davvero. –

0

Potrei sbagliarmi, ma penso che il tuo problema sia dovuto al trigger della tua proprietà.

Impostando il tuo TextBox ad essere concentrati, è in effetti invalidare la Trigger sul genitore su modelli, in modo che il grilletto si snoda e inverte la messa a fuoco sul TextBox (quindi non-focalizzazione di esso).

+1

Ma non sei preoccupato per il messaggio di errore? –

Problemi correlati