我编辑了最后一个问题。 我有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键,组合框文本将转到文本框文本。
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;
}
}
答案 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风格)