Kha*_*han 3 c# wpf xaml datagrid itemssource
我有一个WPF应用程序与两个DataGrids共享相同的ItemsSource.当我将DataGrid的一个IsReadOnly属性设置为true时,我将无法将记录添加到其他DataGrid.我仍然可以编辑第二个数据网格的内容,但只是无法添加记录.
这是有意的吗?这有什么办法吗?我可以对DataGrid使用IsEnabled ="False",但是我失去了滚动它的能力.
这是设置:
XAML:
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <DataGrid Name="dgA" Grid.Row="0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
            <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" />
        </DataGrid.Columns>         
    </DataGrid>
    <DataGrid Name="dgB" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
            <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>
C#:
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<Person> persons = new List<Person>();
        persons.Add(new Person() { FirstName = "Bob", LastName = "Johnson" });
        persons.Add(new Person() { FirstName = "John", LastName = "Smith" });
        dgA.ItemsSource = persons;
        dgB.ItemsSource = persons;
    }
    class Person
    {
        public Person() { }
        public string FirstName
        {
            get;
            set;
        }
        public string LastName
        {
            get;
            set;
        }
    }
}
我认为正在发生的事情是该IsReadOnly属性正在DataGrid通过DefaultView进行只读persons,并且由于这个DefaultView对于你们DataGrid's两个都是相同的,因此两者都失去了添加新行的能力.
然而,两者都不会变成只读(正如你在你的问题中所说的那样)所以我不确定这是一个错误还是一个想要的行为.
我也不确定这里会发生什么导致这种行为,但你可以通过调试器验证CollectionView是否相同(因为CollectionView属性是私有的).以下三个陈述是真实的
dgA.Items.CollectionView == CollectionViewSource.GetDefaultView(persons) // true
dgB.Items.CollectionView == CollectionViewSource.GetDefaultView(persons) // true
dgA.Items.CollectionView == dgB.Items.CollectionView // true
你可以得到它通过改变工作,你喜欢的方式List到ObservableCollection和使用单独ListViewCollection's为您DataGrid's
public MainWindow()
{
    InitializeComponent();
    ObservableCollection<Person> persons = new ObservableCollection<Person>();
    persons.Add(new Person() { FirstName = "Bob", LastName = "Johnson" });
    persons.Add(new Person() { FirstName = "John", LastName = "Smith" });
    dgA.ItemsSource = new ListCollectionView(persons);
    dgB.ItemsSource = new ListCollectionView(persons);
}
| 归档时间: | 
 | 
| 查看次数: | 2224 次 | 
| 最近记录: |