Wpf选择不工作 - Linq

时间:2013-09-05 06:36:59

标签: wpf c#-4.0 data-binding

我有一个绑定了一些数据的网格,来自数据库的下方和一个编辑按钮

<DataGrid AutoGenerateColumns="False" Name="SParts_grid" HorizontalAlignment="Center" Margin="32,101,32,0" VerticalAlignment="Top" Height="187" Width="530" >
    <DataGrid.Columns>
        <DataGridTextColumn  Header="Part No" Binding="{Binding Path=SPartID}" />
        <DataGridTextColumn Header="Part Code" Width="85" Binding="{Binding Path=SPartCode}" />
        <DataGridTextColumn Header="Part Name" Width="160" Binding="{Binding Path=SPartName}" />
        <DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=ModelName}" />
        <DataGridTextColumn Header="Location" Binding="{Binding Path=SPartLocation}" />
        <DataGridCheckBoxColumn Header="Active" Width="58" Binding="{Binding Path=SPartActive}" />
    </DataGrid.Columns>
</DataGrid>

<Button x:Name="btnEdit" Content="Edit" HorizontalAlignment="Left" Margin="105,323,0,0" VerticalAlignment="Top" Width="75" Click="btnEdit_Click"/>

从名为TblSpareParts的db表中提取的所有数据只有一列"ModelName"来自另一个名为TblBikeModels的表

所以我的代码在下面获取数据

window loaded function

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    LoadParts();
}

private void LoadParts()
{
    RST_DBDataContext conn = new RST_DBDataContext();
    var AllPArts = (from s in conn.TblSpareParts
                    join m in conn.TblBikeModels on s.ModelID equals m.ModelID
                    select new { s.SPartName, s.SPartCode, s.SPartLocation, s.SPartID, m.ModelName }).ToArray();
    SParts_grid.ItemsSource = AllPArts;
}

它运作良好,但现在如果我需要选择它,它不能如下工作

private void btnEdit_Click(object sender, RoutedEventArgs e)
        {

                TblSparePart SelectedSPData = SParts_grid.SelectedItem as TblSparePart;
                if (SelectedSPData == null)
                {
                    MessageBox.Show("You Must Select a Part");
                }

                else
                {
                    MessageBox.Show("Selected");
                }
        }

但是当我使用这个LoadParts函数时,selecteditem工作正常,但它没有显示ModelName列中的数据

private void LoadParts()
        {
            RST_DBDataContext conn = new RST_DBDataContext();
            List<TblSparePart> AllPArts = (from s in conn.TblSpareParts
                                            select s).ToList();
            SParts_grid.ItemsSource = AllPArts;
        }

基本上问题出在LoadParts函数

2 个答案:

答案 0 :(得分:0)

执行select new { s.SPartName, s.SPartCode, s.SPartLocation, s.SPartID, m.ModelName }时,将返回匿名类型,而不是TblSparePart对象。

这就是投射SParts_grid.SelectedItem as TblSparePart;返回null

的原因

答案 1 :(得分:0)

我认为你有一个UI设计问题。使用DataGrid中的联接表肯定会获得重复数据,这是您可能必须避免的。更好的解决方案是使用两个DataGrid或(ComboBoxDataGrid)一个用于模型表,另一个用于与模型相关的项目。

如果您正在使用Entity框架,那么任务就容易多了。您只需将绑定指向相关的模型表即可。
看看这个案子:

public class Item 
{
  public int Id {get;set;}
  public string Name {get;set;}
  public Model Model {get;set;}
}

public class Model 
{
  public int Id {get;set;}
  public string Name {get;set;}
}

在这里你可以像你第二次那样做。通过仅加载DataGrid中的Items表,您可以添加指向Model Name属性的列。由于EF提供的延迟加载,它将准备好显示。

  <DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=Model.name}" />