Jandy
Jandy

Reputation: 359

RelayCommand for button inside a TextBox

I have a button inside a TextBox.I want to Bind Command for my button.But It not working when I click on button. Here is TextBox Template in App.xaml:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <ScrollViewer Name="PART_ContentHost"
                  VerticalAlignment="Center"
                  Margin="10,0" Grid.Column="0"/>
    <Button Command="{Binding CmdRandom, RelativeSource={x:Static RelativeSource.Self}}"
            Height="15"
            Width="15"
            Grid.Column="1" />
</Grid>

ViewModel:

    string getrnd;
    public string GetRnd {
        set {
            getrnd = value;
            OnPropertyChanged("GetRnd");
        }
        get {
            return getrnd;
        }
    }
    public ICommand CmdRandom {
        set {
            cmdrnd = value;
        }
        get {
            cmdrnd = cmdrnd ?? new RelayCommand(x => BindRandom(), x => true);
            return cmrnd;
        }
    }

   void BindRandom()
   {
        GetRnd = new RandomChar();
   }

My TextBox:

<TextBox x:Name="txtName" Style="{StaticResource txtRnd}" MaxLength="63" Text="{Binding GetRnd, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" />

Upvotes: 2

Views: 114

Answers (1)

StepUp
StepUp

Reputation: 38094

If you want to get a property on an ancestor:

{Binding DataContext.CmdRandom, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBox}}}

More info:

Binding RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}}

The default attribute of RelativeSource is the Mode property. A complete set of valid values is given here (from MSDN):

  • PreviousData Allows you to bind the previous data item (not that control that contains the data item) in the list of data items being displayed.

  • TemplatedParent Refers to the element to which the template (in which the data-bound element exists) is applied. This is similar to setting a TemplateBindingExtension and is only applicable if the Binding is within a template.

  • Self Refers to the element on which you are setting the binding and allows you to bind one property of that element to another property on the same element.

  • FindAncestor Refers to the ancestor in the parent chain of the data-bound element. You can use this to bind to an ancestor of a specific type or its subclasses. This is the mode you use if you want to specify AncestorType and/or AncestorLevel.

Upvotes: 1

Related Questions