Wpf 将datagrid绑定到viewmodel

Wpf 将datagrid绑定到viewmodel,wpf,binding,datagrid,Wpf,Binding,Datagrid,在wrt数据绑定下面的mvvm模式中,我做错了什么 我看到的是一个DataGrid显示了一个额外的列和一个额外的行(都是空的),为什么 和:我必须如何让视图在默认情况下选择第一项 视图模型: public class Instance { public string Name { get; set; } } public class BaseData { public ObservableCollection<Instance> Instances { get { retu

在wrt数据绑定下面的mvvm模式中,我做错了什么

我看到的是一个
DataGrid
显示了一个额外的列和一个额外的行(都是空的),为什么

和:我必须如何让视图在默认情况下选择第一项

视图模型:

public class Instance { public string Name { get; set; } }

public class BaseData
{
    public ObservableCollection<Instance> Instances { get { return instances; } }
    public BaseData()
        {
            var bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(fetch);
            bw.RunWorkerAsync();
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(fetched);
        }
    void fetch(){...}
    void fetched(..){... // raise event 'Fetched' to the view }
}
1) CanUserAddRows=“False”将删除额外的行

2) 列上的Width=“*”将延伸到网格的宽度,并隐藏看起来像另一列的内容

   <DataGrid  CanUserAddRows="False" AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Instance" Binding="{Binding Path=Name, Mode=OneWay}" Width="*" />
        </DataGrid.Columns>
   </DataGrid>

要选择数据网格中的第一项,您的数据网格定义应为

<DataGrid AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}" SelectedIndex="0">

您必须关闭DataGrid上的AutoGenerateColumns,并声明自己的列以显示所需内容

至于选择项目,您可以将DataGrid的SelectedItem绑定到ViewModel属性。 然后可以将SelectedItem设置为第一个实例

 <DataGrid AutoGenerateColumns="False"
           ItemsSource="{Binding Instances}"
           SelectedItem="{Binding SelectedInstance, Mode=TwoWay}">
               <DataGrid.Columns>
                   ...
               </DataGrid.Columns>
 </DataGrid>

...

正确。这样的设计有多奇怪。:),是的,他们希望您配置我已经使用的内容AutoGenerateColumns=“False”它对额外的列没有影响,这可能不是一个列,而是一种“剩余空间”。SelectedItem=“{Binding SelectedInstance}”可能是正确的,第一次不起作用,因此我需要SelectedIndex=“0”默认情况下,列将只占用它们所需的空间,如果网格比列所需的更宽,则最终会得到一些额外的空间。将其中一列设置为Width=“*”,它将占用剩余的空间。对于SelectedInstance不起作用,您必须确保引发OnPropertyChanged,以便在更改属性时通知视图。
<DataGrid AutoGenerateColumns="False" x:Name="dgInstances" ItemsSource="{Binding Instances}" SelectedIndex="0">
 <DataGrid AutoGenerateColumns="False"
           ItemsSource="{Binding Instances}"
           SelectedItem="{Binding SelectedInstance, Mode=TwoWay}">
               <DataGrid.Columns>
                   ...
               </DataGrid.Columns>
 </DataGrid>