2017-07-27 6 views
0

Ich habe einen benutzerdefinierten Stil für eine SearchTextBox. Ich habe mehrere Bindungen in dieser Kontrolle.WPF - Festlegen der Eigenschaften von untergeordneten Steuerelementen des benutzerdefinierten Stils

<Style TargetType="{x:Type controls:SearchTextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:SearchTextBox}"> 
       <Grid> 
        <TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"> 
         <TextBox.InputBindings> 
          <KeyBinding Command="{Binding Path=SearchCommand}" Key="Enter" /> 
          <KeyBinding Command="{Binding Path=DeleteSearchCommand}" Key="Esc" /> 
         </TextBox.InputBindings> 
        </TextBox> 
        <Button Style="{StaticResource WatermarkButtonCancelStyle}" HorizontalAlignment="Right" Command="{Binding DeleteSearchCommand}" Margin="0,0,22,0"/> 
        <Button Style="{StaticResource WatermarkButtonSearchStyle}" HorizontalAlignment="Right" Command="{Binding SearchCommand}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

ich die TextBox in meiner Sicht bin mit hier:

<controls:SearchTextBox Width="300" HorizontalAlignment="Left" Margin="0,0,0,6" /> 

Wie kann ich die Bindungen in meiner Ansicht nach nicht in der Definition des Stils. Damit ich das Steuerelement in mehreren Ansichten mit unterschiedlichen Bindungen verwenden kann?

+0

können Sie den 'DataContext' mit verschiedenen Objekten setzen und den Stil so lassen, wie er ist. Oder Sie könnten Ihrer SearchTextBox Eigenschaften für jede benötigte Bindung hinzufügen. – kusi581

+0

Können Sie mir bitte ein Codebeispiel geben? – user2877820

Antwort

0

Stil für den benutzerdefinierten TextBox:

 <Style TargetType="{x:Type local:SearchTextBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:SearchTextBox}"> 
        <DockPanel DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:SearchTextBox}}}"> 
         <Button DockPanel.Dock="Right" 
           Style="{StaticResource WatermarkButtonCancelStyle}" 
           Command="{Binding DeleteSearchCommand}"/> 
         <Button DockPanel.Dock="Right" 
           Style="{StaticResource WatermarkButtonSearchStyle}" 
           Command="{Binding SearchCommand}" 
           CommandParameter="{Binding Text}"/> 
         <TextBox x:Name="InnerTextBox" 
           Text="{Binding Path=Text}"> 
          <TextBox.InputBindings> 
           <KeyBinding Command="{Binding SearchCommand}" 
              CommandParameter="{Binding Text}" 
              Key="Enter" /> 
           <KeyBinding Command="{Binding DeleteSearchCommand}" 
              Key="Escape" /> 
          </TextBox.InputBindings> 
         </TextBox> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

-Code der SearchTextBox.cs:

public class SearchTextBox : TextBox 
{ 
    public static readonly DependencyProperty SearchCommandProperty = DependencyProperty.Register(
     "SearchCommand", typeof(ICommand), typeof(SearchTextBox), new PropertyMetadata(default(ICommand))); 

    public SearchTextBox() 
    { 
     DeleteSearchCommand = new Command 
     { 
      ExecuteHandler = o => Clear() 
     }; 
    } 

    public ICommand SearchCommand 
    { 
     get { return (ICommand) GetValue(SearchCommandProperty); } 
     set { SetValue(SearchCommandProperty, value); } 
    } 

    public Command DeleteSearchCommand { get; private set; } 
} 

Da der Befehl für die TextBox Clearing immer das gleiche ist, enthält die SearchTextBox auf den Befehl zum Löschen es.

Jetzt ist es möglich, die SearchTextBox in einer Ansicht zu verwenden und nur die SearchCommand Eigenschaft festzulegen.

<local:SearchTextBox Height="30" Width="200" SearchCommand="{Binding DoTheSearch}"/> 

Wie Sie im Stil für die SearchTextBox wird der Text gesetzt als Parameter für den SearchCommand sehen können, so können Sie es verwendet, in dem der Befehl angegeben wird.

Verwandte Themen