在DataGrid WPF中查找文本框

时间:2015-09-24 07:36:30

标签: c# wpf xaml datagrid

我编辑了最后一个问题。 我有2个班级

    public class Signal: INotifyPropertyChanged 
{
    public string Name { get; set;}
    public Int32 Value { get; set;}

    private ObservableCollection < RawVal > rawValue1;
    public ObservableCollection < RawVal > rawValue 
    {
        get  { return rawValue1; }
        set 
        {   rawValue1 = value;
            OnPropertyChanged("rawValue");
            if (value != null && value.Count > 0) 
            {
             SelectedRaValue = value.First();
            }
        }
    }

    private RawVal selectedRaValue;
    public RawVal SelectedRaValue 
    {
        get 
        {
            return selectedRaValue;
        }
        set 
        {
            selectedRaValue = value;
            OnPropertyChanged("SelectedRaValue");
            ComboValue = value.name;
            OnPropertyChanged("ComboValue");
        }
    }    
    public string ComboValue 
    {
        get;
        set;
    }    
    #region Implementation of INotifyPropertyChanged    
    public event PropertyChangedEventHandler PropertyChanged;    
    protected virtual void OnPropertyChanged(string propertyName) 
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }    
    #endregion

}

在这里XAML:

 <DataGrid ItemsSource="{Binding}" Name="grdSignal" Grid.Row="1" CanUserAddRows="False" AutoGenerateColumns="False" SelectionChanged="grdSignal_SelectionChanged_1">
 <DataGrid.Columns>
    <DataGridTextColumn Header="Signal Name" Binding="{Binding Name}" Width="150"/>
                                <DataGridTemplateColumn Header="Physical Value" Width="120">
          <DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                  <ComboBox ItemsSource="{Binding rawValue, Mode=TwoWay}" SelectedItem="{Binding SelectedRaValue,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath="name" Name="cmbVal"  
                       IsEditable="True" KeyDown="cmbVal_KeyDown"  />
             </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Value" Width="100">
            <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                <TextBox Text="{Binding ComboValue}" Name="tBoxValue" TextChanged="tBoxVale_textChanged"/>
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
      <DataGridTemplateColumn Header="Comment" Width="200">
    <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <TextBox Text="{Binding Comment}"/>
             </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
   </DataGridTemplateColumn>
  </DataGrid.Columns>
 </DataGrid>      

enter image description here          As shown in pic, when Combobox selected Item changes, Textbox value is changed according to SelectedItem of Combobox 现在,这是我的问题。组合框是可编辑的,如果用户输入任何内容(字符串),然后按ENTER键,组合框文本将转到文本框文本。

private void cmbVal_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Return)
        {               
            string s = ((ComboBox)sender).Text;
            DataGridRow row = sigGrid.ItemContainerGenerator.ContainerFromIndex(sigGrid.SelectedIndex) as DataGridRow;
            var i = 3;
            TextBox ele = sigGrid.FindName("tbValue") as TextBox;
        }

    }

结果是: enter image description here

2 个答案:

答案 0 :(得分:2)

@Mamurbek,

您可以使用该帖子的FindVisualDescendants函数:
Datagrid templatecolumn update source trigger explicit only updates first row

使用该功能,您可以拥有所有文本框:

var textboxes = AccessGrid.FindAllVisualDescendants()
    .Where(elt => elt.Name == "tBoxValue" )
    .OfType<TextBox>();

仅举例说明:

var textboxes = AccessGrid.FindAllVisualDescendants()
    .Where(elt => elt.Name == "tBoxValue" )
    .OfType<TextBox>()
    .FirstOrDefault();

或者仅使用Skip and Take:

int n = 3;
var textboxes = AccessGrid.FindAllVisualDescendants()
    .Where(elt => elt.Name == "tBoxValue" )
    .OfType<TextBox>()
    .Skip(n-1)
    .Take(1);

希望有所帮助

答案 1 :(得分:1)

如果在xaml中使用绑定,显然有一个对象用作名为grdSignal的网格的datacontext。

从这条线......

  <TextBox Text="{Binding Comment}"/>

我可以看到绑定的对象具有Comment属性:

如果要读取或写入此值,则必须找到相应属性是绑定到网格的数据源(使用数据上下文)并读取或分配此属性。

在您的情况下,如果您为此属性分配值(如果它实现INotifyPropertyChanged),则TextBox将自动更新为新值。

总结:

  • 如果您使用绑定,则必须从/向属性读取和分配 您的数据类,以便与UI进行通信。绑定将目标(UI中的控件)连接到源(数据上下文类或视图模型中的数据),因此不需要在视图中命名控件。

  • 如果你不使用绑定,你可以使用代码隐藏文件与UI进行通信,并按名称访问元素,但这不是它应该在WPF中完成的方式(不是MVVM风格)