积极答复者
不使用dataform,只是普通窗口增加一个ComboBox,怎样让ComboBox绑定一个DataGrid字段的值.

问题
答案
-
很简单啊,只要用TwoWay绑定就能实现了,给你个代码
<Grid x:Name="LayoutRoot" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.4*"/> <ColumnDefinition Width="0.6*"/> </Grid.ColumnDefinitions> <ComboBox x:Name="MyComboBox" Height="29" VerticalAlignment="Top" d:LayoutOverrides="Width"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding ID}"/> <TextBox Text="{Binding Content,Mode=TwoWay}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <data:DataGrid x:Name="MyDataGrid" Grid.Column="1"> <data:DataGrid.Columns> <data:DataGridTextColumn Header="ID" Width="60" Binding="{Binding ID}" IsReadOnly="True" /> <data:DataGridTextColumn Header="Content" Width="150" Binding="{Binding Content,Mode=TwoWay}" IsReadOnly="True" /> </data:DataGrid.Columns> </data:DataGrid> </Grid>
void MainPage_Loaded(object sender, RoutedEventArgs e) { myCominfoes = ComInfo.GetSameple(); MyComboBox.ItemsSource = myCominfoes; MyDataGrid.ItemsSource = myCominfoes; }
public class ComInfo : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public int ID { get; set; } private string _Content; public string Content { get { return _Content; } set { _Content = value; NotifyPropertyChanged("Content"); } } public static List<ComInfo> GetSameple() { List<ComInfo> MyComInfoes = new List<ComInfo>(); for (int i = 1; i < 10; i++ ) { ComInfo myComInfo = new ComInfo(); myComInfo.ID = i; myComInfo.Content = i + "Content"; MyComInfoes.Add(myComInfo); } return MyComInfoes; } public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
这样你更新ComboBox对应的DataGrid行也就更新了,当然方法还不止这么一种,其他的需要更多的代码来解决- 已标记为答案 Allen Chen - MSFTModerator 2009年6月16日 6:01
全部回复
-
DataGrid本身就是需要别的资源来提供ItemsSource的, ComboBox也是,所以最好不直接绑定Combox到DataGrid. 需要很多Cast才行.
建议做一个共享的数据源,DataGrid, Combox分别绑定. myComboBox.ItemsSource = myList.Select(p=>p.City).Distinct();
但如果是dataform,又是什么方式呢?难道也要用ItemsSource来赋值吗?
因为其中一个字段,可能就是几个固定值的取值,如:在职,离职,退休.这样的字段.不用radio的情况下.
aaaa -
很简单啊,只要用TwoWay绑定就能实现了,给你个代码
<Grid x:Name="LayoutRoot" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.4*"/> <ColumnDefinition Width="0.6*"/> </Grid.ColumnDefinitions> <ComboBox x:Name="MyComboBox" Height="29" VerticalAlignment="Top" d:LayoutOverrides="Width"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding ID}"/> <TextBox Text="{Binding Content,Mode=TwoWay}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <data:DataGrid x:Name="MyDataGrid" Grid.Column="1"> <data:DataGrid.Columns> <data:DataGridTextColumn Header="ID" Width="60" Binding="{Binding ID}" IsReadOnly="True" /> <data:DataGridTextColumn Header="Content" Width="150" Binding="{Binding Content,Mode=TwoWay}" IsReadOnly="True" /> </data:DataGrid.Columns> </data:DataGrid> </Grid>
void MainPage_Loaded(object sender, RoutedEventArgs e) { myCominfoes = ComInfo.GetSameple(); MyComboBox.ItemsSource = myCominfoes; MyDataGrid.ItemsSource = myCominfoes; }
public class ComInfo : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public int ID { get; set; } private string _Content; public string Content { get { return _Content; } set { _Content = value; NotifyPropertyChanged("Content"); } } public static List<ComInfo> GetSameple() { List<ComInfo> MyComInfoes = new List<ComInfo>(); for (int i = 1; i < 10; i++ ) { ComInfo myComInfo = new ComInfo(); myComInfo.ID = i; myComInfo.Content = i + "Content"; MyComInfoes.Add(myComInfo); } return MyComInfoes; } public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
这样你更新ComboBox对应的DataGrid行也就更新了,当然方法还不止这么一种,其他的需要更多的代码来解决- 已标记为答案 Allen Chen - MSFTModerator 2009年6月16日 6:01