RelayCommand用于TextBox中的按钮

时间:2016-06-18 11:46:53

标签: c# wpf

我在TextBox中有一个按钮。我想为我的按钮绑定命令。但是当我点击按钮时它不起作用。 这是App.xaml中的T​​extBox模板:

<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>

视图模型:

    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" />

1 个答案:

答案 0 :(得分:1)

如果你想在祖先上获得一个房产:

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

更多信息:

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

RelativeSource的默认属性是Mode属性。这里给出了一整套有效值(from MSDN):

  • PreviousData 允许您在显示的数据项列表中绑定上一个数据项(而不是包含数据项的控件)。

  • TemplatedParent 指应用模板(其中存在数据绑定元素)的元素。这与设置TemplateBindingExtension类似,仅在Binding位于模板中时才适用。

  • Self 指您设置绑定的元素,并允许您将该元素的一个属性绑定到同一元素上的另一个属性。

  • FindAncestor 指数据绑定元素的父链中的祖先。您可以使用它来绑定到特定类型或其子类的祖先。如果要指定AncestorType和/或AncestorLevel,则使用此模式。