none
不使用dataform,只是普通窗口增加一个ComboBox,怎样让ComboBox绑定一个DataGrid字段的值. RRS feed

答案

  • 很简单啊,只要用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行也就更新了,当然方法还不止这么一种,其他的需要更多的代码来解决
    2009年6月16日 1:17
    版主

全部回复

  • DataGrid本身就是需要别的资源来提供ItemsSource的, ComboBox也是,所以最好不直接绑定Combox到DataGrid. 需要很多Cast才行.
    建议做一个共享的数据源,DataGrid, Combox分别绑定. myComboBox.ItemsSource = myList.Select(p=>p.City).Distinct();

    2009年6月10日 5:41
  • DataGrid本身就是需要别的资源来提供ItemsSource的, ComboBox也是,所以最好不直接绑定Combox到DataGrid. 需要很多Cast才行.
    建议做一个共享的数据源,DataGrid, Combox分别绑定. myComboBox.ItemsSource = myList.Select(p=>p.City).Distinct();


    但如果是dataform,又是什么方式呢?难道也要用ItemsSource来赋值吗?

    因为其中一个字段,可能就是几个固定值的取值,如:在职,离职,退休.这样的字段.不用radio的情况下.
    aaaa
    2009年6月10日 6:39
  • 比较推荐的是使用PagedCollectionView, 如果你用的是DomainDataSource,那里用的是EntityCollectionView,两者代码很近似。

    DataForm要指定自定义的Template比较好。另外DataForm 正式发布的时候会有一些改变。
    2009年6月10日 6:45
  • 比较推荐的是使用PagedCollectionView, 如果你用的是DomainDataSource,那里用的是EntityCollectionView,两者代码很近似。

    DataForm要指定自定义的Template比较好。另外DataForm 正式发布的时候会有一些改变。

    就像TextBox一样,我在新窗口中,改变了TextBox的值,就能更新datagrid中的值.
    不知道ComboBox会有什么方式.能做到跟TextBox那样.
    aaaa
    2009年6月10日 6:50
  • 很简单啊,只要用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行也就更新了,当然方法还不止这么一种,其他的需要更多的代码来解决
    2009年6月16日 1:17
    版主