【问题标题】:passing selecteditems to a stored procedure from wpf datagrid through mvvm通过 mvvm 将选定项从 wpf 数据网格传递到存储过程
【发布时间】:2015-07-09 11:19:56
【问题描述】:

我已经在不使用 MVVM 的情况下实现了这一点:

private void Del_btn_Click(object sender, RoutedEventArgs e)
{
    try
    {
        List<string> cid = new List<string>();
        foreach (DataRowView rw in Xgrid.SelectedItems)
        {

            cid.Add(rw[1].ToString());
            MessageBox.Show("Deleting " + rw[1].ToString());
        }

        foreach (string cq in cid)
        {
            SqlConnection con = new SqlConnection(str);

            con.Open();
            SqlCommand cmd = new SqlCommand("delete_prc", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param1 = new SqlParameter();
            param1.ParameterName = "@Cid";
            param1.SqlDbType = SqlDbType.NVarChar;
            param1.Value = cq;
            cmd.Parameters.Add(param1);
            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

现在我想用 MVVM 来做这件事。

我有customers.cs 模型类,其中包含所有字段。 现在我不知道如何绑定复选框,所以我可以做到这一点。

Xaml 代码:

<DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <Grid>
            <CheckBox   IsChecked="{Binding Path=ViewModelBase.CheckAll, 
                        Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        RelativeSource={RelativeSource FindAncestor,
                        AncestorType={x:Type DataGridRow}}}" Name="delete"/>
        </Grid>
    </DataTemplate>
</DataGrid.RowHeaderTemplate>

<DataGrid.Columns>
    <DataGridTextColumn Header="rowNo." Width="60" Binding="{Binding RowNumber}" IsReadOnly="True">
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="HorizontalAlignment" Value="Center" />
            </Style>
        </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
    <DataGridTextColumn Header="CustomerID" Width="80" Binding="{Binding CustomerID}" IsReadOnly="True"></DataGridTextColumn>
    <DataGridTextColumn Header="CompanyName" Width="100" Binding="{Binding CompanyName}"></DataGridTextColumn>
    <DataGridTextColumn Header="ContactName" Width="100" Binding="{Binding ContactName}"></DataGridTextColumn>
    <DataGridTextColumn Header="ContactTitle" Width="100" Binding="{Binding ContactTitle}"></DataGridTextColumn>
    <DataGridTextColumn Header="Address" Width="80" Binding="{Binding Address}"></DataGridTextColumn>
    <DataGridTextColumn Header="City" Width="100" Binding="{Binding City}"></DataGridTextColumn>
    <DataGridTextColumn Header="Region" Width="80" Binding="{Binding Region}"></DataGridTextColumn>
    <DataGridTextColumn Header="PostalCode" Width="100" Binding="{Binding PostalCode}"></DataGridTextColumn>
    <DataGridTextColumn Header="Country" Width="100" Binding="{Binding Country}"></DataGridTextColumn>
    <DataGridTextColumn Header="Phone" Width="100" Binding="{Binding Phone}"></DataGridTextColumn>
    <DataGridTextColumn Header="Fax" Width="100" Binding="{Binding Fax}"></DataGridTextColumn>

</DataGrid.Columns>

那么如何将它与 mvvm 集成。请帮我这样做。

我想知道要在我的视图模型类中定义什么以及执行此操作的绑定路径应该是什么。

【问题讨论】:

  • 在 viewmodel 中定义什么是什么意思?
  • 如果您询问如何在 viewmodel 中点击按钮,请使用“命令”来执行此操作。
  • 我想将选定的项目传递给我的程序。我的程序只需要客户 ID。所以最初我通过 xgrid.selecteditems 循环选择的每一行的第一列。
  • 您必须在视图模型中绑定网格的选定项属性,然后您可以在视图模型上循环遍历此属性的每个项以执行任何 sql 操作。

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

在你的 DataGrid 中放一个类似的命令,你需要添加

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

  <DataGrid HorizontalAlignment="Left" VerticalAlignment="Top" Height="103" Width="517">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding GetItem}" CommandParameter="{Binding Header,ElementName=id}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
   </DataGrid>

并像这样在 ViewModel 中访问命令

  RelayCommand getitem;
    public RelayCommand GetItem
    {
        get
        {
            if(getitem == null)
            {
                getitem = new RelayCommand(p=>Executeyourcommand(p));
            }
            return getitem;
        }
    }


  void Executeyourcommand(object parameter)
    {
        // parameter is your CustomerID
       // do your work here
    }

你的命令助手类

 public class RelayCommand : ICommand
{
    readonly Action<object> execute;
    readonly Predicate<object> canexecute;

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {

    }
    public RelayCommand(Action<object> Execute, Predicate<object> Canexecute)
    {
        if(Execute == null)
            throw new ArgumentNullException("execute");
        execute = Execute;
        canexecute = Canexecute;
    }
    public bool CanExecute(object parameter)
    {
        if(canexecute == null)
            return true;
        else
            return canexecute(parameter);
    }
    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
        }
    }
    public void Execute(object parameter)
    {
        execute(parameter);
    }
}

而且我没有测试代码,我希望这是你正在寻找的

【讨论】:

  • @shambhavichandra 很高兴它有帮助
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2010-11-11
  • 2012-09-01
  • 2015-08-20
相关资源
最近更新 更多