C# Datagrid Combobox将选定项值绑定到Textbox
希望你做得很好,并作为大师编码 接下来是Datagrid绑定问题,这让我痛苦了两天。我问了另外一个与这个问题相关的问题并解决了它,但这里是另一个问题 我有RawVal结构和Signal类(有observeCollection) 当用户选择“尾门钥匙触发器”时,文本框中显示3。选择“无远程RQ触发器”时,0 欢迎提出任何建议和解决方案,C# Datagrid Combobox将选定项值绑定到Textbox,c#,wpf,xaml,combobox,datagrid,C#,Wpf,Xaml,Combobox,Datagrid,希望你做得很好,并作为大师编码 接下来是Datagrid绑定问题,这让我痛苦了两天。我问了另外一个与这个问题相关的问题并解决了它,但这里是另一个问题 我有RawVal结构和Signal类(有observeCollection) 当用户选择“尾门钥匙触发器”时,文本框中显示3。选择“无远程RQ触发器”时,0 欢迎提出任何建议和解决方案, 谢谢。我创建了一个基于MVVM的简单解决方案,以指导您如何实现 ViewModel类 class ViewModel : INotifyPropertyChang
谢谢。我创建了一个基于MVVM的简单解决方案,以指导您如何实现 ViewModel类
class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Signal> _source;
public IEnumerable<Signal> MySource
{
get { return _source; }
}
private RawVal _rawValSelected;
public RawVal RawValSelected
{
get { return _rawValSelected; }
set
{
_rawValSelected = value;
RaisePropertyChanged("RawValSelected");
}
}
public void RaisePropertyChanged(string propName)
{
var pc = PropertyChanged;
if (pc != null)
{
pc(this, new PropertyChangedEventArgs(propName));
}
}
public ViewModel()
{
_source = new ObservableCollection<Signal>
{
new Signal{
Name = "Test",
Value = 1,
rawValue = new ObservableCollection<RawVal>
{
new RawVal{name="Search Key Trigger",value=4},
new RawVal{name="Tailgate Key Trigger",value=3},
new RawVal{name="Un-Lock Key Trigger",value=2},
new RawVal{name="Lock Key Trigger",value=1},
new RawVal{name="No Remote RQ Trigger",value=0}
}
}
};
}
}
您必须为
信号
执行INotifyPropertyChanged
事件,并使用组合框
的SelectedItem
属性设置文本框
专栏
Xaml代码:
<DataGrid ItemsSource="{Binding}" Name="grdSignal" Grid.Row="1" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header=" Signal Name" Binding="{Binding Name}" Width="150"/>
<DataGridTemplateColumn Header=" Physical Value " Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding rawValue, Mode=OneWay}" SelectedItem="{Binding SelectedRaValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="name" Name="cmbVal"
Visibility="{Binding Path=rawValue.Count, Converter={StaticResource ComboBoxItemCountToEnabledConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header=" Value " Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding ComboValue}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
希望这有帮助 谢谢你的关注,兄弟,但还有一个问题。在您的代码中,如果有几行,则会出错。当一个组合框更改时,更改将影响所有文本框,并且它们更改为相同的值。
4 - Search Key Trigger
3 - Tailgate Key Trigger
2 - Un-Lock Key Trigger
1 - Lock Key Trigger
0 - No Remote RQ Trigger
class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Signal> _source;
public IEnumerable<Signal> MySource
{
get { return _source; }
}
private RawVal _rawValSelected;
public RawVal RawValSelected
{
get { return _rawValSelected; }
set
{
_rawValSelected = value;
RaisePropertyChanged("RawValSelected");
}
}
public void RaisePropertyChanged(string propName)
{
var pc = PropertyChanged;
if (pc != null)
{
pc(this, new PropertyChangedEventArgs(propName));
}
}
public ViewModel()
{
_source = new ObservableCollection<Signal>
{
new Signal{
Name = "Test",
Value = 1,
rawValue = new ObservableCollection<RawVal>
{
new RawVal{name="Search Key Trigger",value=4},
new RawVal{name="Tailgate Key Trigger",value=3},
new RawVal{name="Un-Lock Key Trigger",value=2},
new RawVal{name="Lock Key Trigger",value=1},
new RawVal{name="No Remote RQ Trigger",value=0}
}
}
};
}
}
<DataGrid ItemsSource="{Binding MySource}" Name="grdSignal" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Signal Name" Binding="{Binding Name}" Width="150" />
<DataGridTemplateColumn Header="Physical Value " Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding rawValue}"
SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=DataContext.RawValSelected}"
DisplayMemberPath="name" SelectedIndex="0" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Value" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=DataContext.RawValSelected.value}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
<DataGrid ItemsSource="{Binding}" Name="grdSignal" Grid.Row="1" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header=" Signal Name" Binding="{Binding Name}" Width="150"/>
<DataGridTemplateColumn Header=" Physical Value " Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding rawValue, Mode=OneWay}" SelectedItem="{Binding SelectedRaValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="name" Name="cmbVal"
Visibility="{Binding Path=rawValue.Count, Converter={StaticResource ComboBoxItemCountToEnabledConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header=" Value " Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding ComboValue}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
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
}
List < Signal > collection = new List < Signal > ();
collection.AddRange((new[]
{
new Signal
{
Name = "Hello",
Value = 1,
rawValue = new ObservableCollection < RawVal > ((new[] {
new RawVal { name = "A", value = 1},
new RawVal {name = "B", value = 1}
}).ToList()),
},
new Signal {
Name = "World",
Value = 2,
rawValue = new ObservableCollection < RawVal > ((new[] {
new RawVal {name = "A", value = 1},
new RawVal {name = "B", value = 1}
}).ToList()),
}
}).ToList());
this.DataContext = collection;