【问题标题】:C# WPF MVVMLight get selecteditem from datagrid in textboxC# WPF MVVMLight 从文本框中的数据网格中获取选定项
【发布时间】:2020-05-06 12:48:04
【问题描述】:

将值从Datagrid selected row 获取到文本框时,我遇到了一个大问题。 用户应该选择一行,视图应该从特定文本框中的行中获取值。之后用户可以在文本框内进行更改并更新数据库。在 Youtube 教程和谷歌上几个小时后,我仍然不知道如何才能达到这一点(文本框中所选行的值)。请帮帮我

下面是 View 和 ViewModel 的代码

用户控制:

<!--Database datagrid-->
        <materialDesign:Card Margin="5">
            <DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext}">

                <DataGrid.Columns>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgMachineID}" Binding="{Binding MachineID, Mode=TwoWay}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerId}" Binding="{Binding CustomerID}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerName}" Binding="{Binding CustomerName}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCity}" Binding="{Binding City}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCountry}" Binding="{Binding Country}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC1}" Binding="{Binding SpindleC1}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC2}" Binding="{Binding SpindleC2}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHoningHead}" Binding="{Binding HoningHead}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgNCVersion}" Binding="{Binding NCVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHMIVersion}" Binding="{Binding HMIVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHRIVersion}" Binding="{Binding HRIVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgAHSVersion}" Binding="{Binding AHSVersion}"/>
                </DataGrid.Columns>
            </DataGrid>
        </materialDesign:Card>

视图模型:

 //Operation button for save, update, delete and print
    public ICommand SaveCommand { get; private set; }
    public ICommand UpdateCommand { get; private set; }
    public ICommand DeleteCommand { get; private set; }
    public ICommand PrintCommand { get; private set; }
    public ICommand ShowAdvCommand { get; private set; }


    public ObservableCollection<Machine> DataContext { get; set; }
    public Machine MachineSelectedItem { get; set; }
    public object MachineDataGrid { get; private set; }

    //Datagrid string

    //PRWContext for general use
    private PRWContext context = new PRWContext();

    public MachineViewModel()
    {
        //Commands for save, update, delete and print
        SaveCommand = new RelayCommand(() => ExecuteSaveCommand());
        UpdateCommand = new RelayCommand(() => ExecuteUpdateCommand());
        DeleteCommand = new RelayCommand(() => ExecuteDeleteCommand());
        PrintCommand = new RelayCommand(() => ExecutePrintCommand());


        ////Load the data from PRW Database to datagrid
        LoadData();
    }

    private void ExecuteSaveCommand()
    {
        Machine machine = new Machine
        {
            //Machine data
            MachineID = MachineID,
            CustomerID = CustomerID,
            CustomerName = CustomerName,
            City = City,
            Country = Country,

            //Serial data
            SpindleC1 = SpindleC1,
            SpindleC2 = SpindleC2,
            HoningHead = HoningHead,

            //Softwareversion data
            NCVersion = NCVersion,
            HMIVersion = HMIVersion,
            HRIVersion = HRIVersion,
            AHSVersion = AHSVersion
        };

        context.Machines.Add(machine);
        context.SaveChanges();

        ClearText();
    }

    private void ExecuteUpdateCommand()
    {
        Machine machine = context.Machines.FirstOrDefault(w => w.MachineID == MachineID);

        machine.CustomerID = CustomerID;
        machine.CustomerName = CustomerName;

        context.SaveChanges();
        ClearText();
    }

    private void ExecuteDeleteCommand()
    {
        throw new NotImplementedException();
    }

    private void ExecutePrintCommand()
    {
        throw new NotImplementedException();
    }

    //Load data from database to grid
    private void LoadData()
    {
        context.Machines.Load();
        this.DataContext = context.Machines.Local;
    }

    //Clear textboxes
    private void ClearText()
    {
        MachineID = string.Empty;
        CustomerID = string.Empty;
        CustomerName = string.Empty;
        City = string.Empty;
        Country = string.Empty;
        SpindleC1 = string.Empty;
        SpindleC2 = string.Empty;
        HoningHead = string.Empty;
        NCVersion = string.Empty;
        HMIVersion = string.Empty;
        HRIVersion = string.Empty;
        AHSVersion = string.Empty;
    }

我尝试使用 eventtrigger for selectionchanged 命令和我在其他问题中看到的几种不同方式来做到这一点,但我很不幸:(

【问题讨论】:

    标签: c# wpf datagrid selecteditem


    【解决方案1】:

    我认为您错过了获得所选项目所需做的一些事情。

    正如您所做的那样,您需要(在您的 XAML 代码中)将您的 DataGrid 绑定到您的 ItemSource。而且,您可以使用属性 SelectdItem

    因此,您最终会得到如下所示的内容:(我刚刚包含了重要的部分)

    <DataGrid ItemsSource="{Binding DataContext}"  SelectedItem="{Binding Path=MachineSelectedItem }"/>
    
    

    你可以得到进一步的解释 on this existent answer 但我所说的应该可以解决问题 ;)

    【讨论】:

    • 您好,感谢您的快速回答。你链接的问题我今天下午也看到了。我试图这样做,但它没有工作。
    • 我刚刚使用了您添加的代码,但我仍然遇到同样的问题。我是否缺少其他东西,然后只是绑定?我真的很困惑,因为当我在后面的代码中使用 SelectionChanged 事件时它也不起作用
    • 您在绑定 DataGrid 时是否在 XAML 中设置了 Mode=TwoWay
    【解决方案2】:

    几个小时前,我发现我的代码有问题; ) 我必须在我的 ViewModel 中插入以下代码:

     private Machine machineSelectedItem;
        public Machine MachineSelectedItem
        {
            get { return machineSelectedItem; }
            set { machineSelectedItem = value; OnPropertyChanged(); }
        }
    

    SelectionChanged 命令:

    public ICommand SelectionChangedCommand { get; set; }` SelectionChangedCommand = new RelayCommand(() => ExecuteSelectionChangedCommand());` private void ExecuteSelectionChangedCommand()
        {
            **MachineID = machineSelectedItem.MachineID ? .ToString() ?? "";
            CustomerID = machineSelectedItem.CustomerID ? .ToString() ?? "";**
        }
    

    在视图中:

    <DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext, Mode=TwoWay}" SelectedItem="{Binding Path=MachineSelectedItem, Mode=TwoWay}">
                    <ie:Interaction.Triggers>
                        <ie:EventTrigger EventName="SelectionChanged">
                            <ie:InvokeCommandAction Command="{Binding SelectionChangedCommand}"  CommandParameter="{Binding ElementName=MachineDataGrid, Path=SelectedItem}"/>
                        </ie:EventTrigger>
                    </ie:Interaction.Triggers>
    

    这可以完成我需要的工作。也许这是一个丑陋的解决方案,但我暂时不在乎。

    【讨论】:

    • 这里有一个小的更新,因为字符串的空异常。为了避免空异常,如果字符串为空,则必须清空字符串。
    猜你喜欢
    • 2015-07-30
    • 2019-11-16
    • 2013-09-28
    • 2019-08-16
    • 2012-09-26
    • 2011-09-12
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多