【问题标题】:Binding datagrid to viewmodel将数据网格绑定到视图模型
【发布时间】:2013-10-31 14:33:14
【问题描述】:

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

视图(xaml):

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

查看(代码隐藏):

BaseData BaseData;

public MainWindow()
{
    InitializeComponent();

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

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

【问题讨论】:

    标签: wpf binding datagrid


    【解决方案1】:

    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>
    

    【讨论】:

    • 正确。这样的设计多么奇怪。
    • :) ,是的,他们希望你配置什么不是
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您必须关闭 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,以便在属性更改时通知视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2011-01-01
      • 2013-09-25
      • 1970-01-01
      • 2017-10-25
      • 2014-01-17
      相关资源
      最近更新 更多