Reputation: 359
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
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