我在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;
}
答案 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>