当用户单击DataGrid中的一行时,我触发了一个Content Dialog.内容对话框的主要目标是允许用户通过内容对话框中名为‘Cmnt_Apprvl_Mgmt’的TextBox控件输入和保存注释.这种逻辑现在起作用了.

现在,我希望从DataGrid中单击的行中的一些数据出现在Content Dialog中.我一直想不出怎么做这件事.

我将‘rowModel’(来自数据网格的数据)作为参数传递给新的内容对话框(V3). 我希望之前为特定行输入的任何备注都填充到内容对话框中的文本框‘Cmnt_Apprvl_Mgmt’中.

提前感谢StackOverflow-贡献者,你们在这个项目中对我帮助很大.这是非常感谢的.

我的代码:(XAML)

<ContentDialog x:Name="MgmtApprovalDialog"
               Title = "Enter Management Approval Comment"
               PrimaryButtonText="Save"
               CloseButtonText="Cancel"
               Opened="MgmtApprovalDialog_Opened"
               PrimaryButtonClick="MgmtApprovalDialog_PrimaryButtonClick">
    <StackPanel>
        <TextBox x:Name="Cmnt_Apprvl_Mgmt" PlaceholderText="Enter Comment" Margin="0 0 0 0" TextWrapping="Wrap" Height="80" TextChanged="Cmnt_Apprvl_Mgmt_TextChanged"/>
        <TextBlock x:Name="errorTextBlock" Margin="0 10 0 5" FontWeight="Bold" FontStyle="Oblique"/>
        <!-- Content body -->
        <TextBlock Name="body" TextWrapping="Wrap">
            <TextBlock.Text>
                When a target is not met, a comment from management is required (long and detailed)                       
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</ContentDialog>

C#

private void MgmtApprovalDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
            // Ensure the comment field is empty. If a required field
            // is empty, set args.Cancel = true to keep the dialog open.
            if (string.IsNullOrEmpty(Cmnt_Apprvl_Mgmt.Text))
            {
                args.Cancel = true;
                errorTextBlock.Text = "Comment is required.";
            }
}
            
private void DataGrid_Detail_PointerReleased(object sender, PointerRoutedEventArgs e)
            {
                DataGridRow clickedRow = FindParent<DataGridRow>((UIElement)e.OriginalSource);
                if (clickedRow != null)
                {
                    Approvals rowModel = (Approvals)clickedRow.DataContext;
                    // Do stuff
                    // DisplayCommentDialog();
                    //DisplayCommentDialog_v2(rowModel);
                    DisplayCommentDialog_v3(rowModel);
                }
            }

        // +---------------------------------------------------------
        // | DISPLAY COMMENT DIALOG V3
        // +---------------------------------------------------------
        private async void DisplayCommentDialog_v3(Approvals rowModel)
        {
            ContentDialogResult result = await MgmtApprovalDialog.ShowAsync();
            if (result == ContentDialogResult.Primary)
            {
                // Save button clicked
                Debug.WriteLine($"+-------------------------------------------------------------------");
                Debug.WriteLine($"| Hello - inside DisplayCommentDialog_v3 Primary Button Clicked!");
                Debug.WriteLine($"| Hello - Comment ID  : {rowModel.Comment_ID}");
                Debug.WriteLine($"| Hello - Comment Text: {Cmnt_Apprvl_Mgmt.Text}");
                Debug.WriteLine($"+-------------------------------------------------------------------");
                SaveMgMtApprovalComment(rowModel.Comment_ID, Cmnt_Apprvl_Mgmt.Text);
                // Before refreshing the DataGrid_Detail you must re-pull from the server (this may be a design flaw.)
                GetSQLData_Approvals();
                // Refresh DataGrid_Detail so the user can see what was just entered
                PopulateApprovalDetDG(v_product);
            }
            else
            {
                // User pressed Cancel, ESC, or the back arrow.
                // Terms of use were not accepted.
                Debug.WriteLine($"+-------------------------------------------------------------------");
                Debug.WriteLine($"| Hello - inside DisplayCommentDialog_v3 (Cancel, ESC, or back arrow)");
                Debug.WriteLine($"+-------------------------------------------------------------------");
            }
        }

推荐答案

解决方案1:DataContext和绑定

一个简单的解决方案是西蒙·莫里尔在他的 comments 中提出的.

只需将ContentDialog中的DataContext设置为所选项目,即可在其属性上启用绑定.

private async void DisplayCommentDialog_v3(Approvals rowModel)
{
    MgmtApprovalDialog.DataContext = rowModel;
    ContentDialogResult result = await MgmtApprovalDialog.ShowAsync();

然后,假设Approvals具有string Comment属性,您可以在TextBox上使用以下绑定.

<TextBox Text="{Binding Comment}" (...) />

解决方案2:子类内容对话框

如果您不想使用绑定,您还可以创建一个从ContentDialog派生的类,它允许您添加自定义逻辑并公开额外的成员. 你可以找到这个here的例子.

在您的情况下,它可能如下所示.

public sealed partial class ApprovalDialog: ContentDialog
{
    public ApprovalDialog()
    {
        this.InitializeComponent();        
    }

    public void SetComment(string comment)
    {
        Cmnt_Apprvl_Mgmt.Text = comment;
    }
}

然后,在显示该对话框之前调用额外的方法:

private async void DisplayCommentDialog_v3(Approvals rowModel)
{
    // Again, I don't know if `Comment` is the correct property name.
    MgmtApprovalDialog.SetComment(rowModel.Comment);
    ContentDialogResult result = await MgmtApprovalDialog.ShowAsync();

您还需要将XAML更改为包含x:Class以指定您的自定义类型.

<ContentDialog x:Class="YourNameSpace.ApprovalDialog"
               x:Name="MgmtApprovalDialog"
               Title = "Enter Management Approval Comment"
      (...)

Csharp相关问答推荐

如何将字节数组转换为字符串并返回?

AsNoTrackingWithIdentitySolutions()似乎不起作用?

如何在Windows 11任务调度程序中每1分钟重复一次任务?

MigraDoc文档

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如果设置了另一个属性,则Newtonsoft JSON忽略属性

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

带有列表参数的表达式树

将操作从编辑页重定向到带参数的索引页

无法使用[FromForm]发送带有图像和JSON的多部分请求

如何避免在.NET中将日志(log)写入相对路径

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

在';、';附近有错误的语法.必须声明标量变量";@Checkin";.';

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

在.NET8中如何反序列化为私有字段?

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

用于分钟和秒验证的MudTextfield的正则表达式掩码

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

MudRadioGroup不切换