将datagrid绑定到viewmodel

时间:2013-10-31 14:33:15

标签: wpf binding datagrid

我在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 }
}

view(xaml):

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

view(代码隐藏):

BaseData BaseData;

public MainWindow()
{
    InitializeComponent();

    Loaded += delegate
    {
        BaseData = new BaseData();
        BaseData.Fetched += basedata_fetched;
    };
}

void basedata_fetched(...)
{
    DataContext = BaseData;
}

3 个答案:

答案 0 :(得分:1)

1)CanUserAddRows =&#34; False&#34;将删除额外的行。

2)宽度=&#34; *&#34;在列上将拉伸到网格的宽度并隐藏看起来像另一列的内容。

   <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>

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您必须关闭DataGrid上的AutoGenerateColumns并声明自己的列以显示您想要的任何内容。

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

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