Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#WPF-在数据网格中添加总计行_C#_.net_Wpf_Datagrid_Caliburn.micro - Fatal编程技术网

c#WPF-在数据网格中添加总计行

c#WPF-在数据网格中添加总计行,c#,.net,wpf,datagrid,caliburn.micro,C#,.net,Wpf,Datagrid,Caliburn.micro,我有一个数据网格: 我想在DataGrid的底部添加一行,其中包含Name:Total和Price:all Price的总和。如果可能的话,这一行将被冻结。 你有什么想法吗? 简单项目位于此链接中: 编辑1 这是XAML代码: <DataGrid ItemsSource="{Binding Articles}" AutoGenerateColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" IsReadOnly=

我有一个数据网格:

我想在DataGrid的底部添加一行,其中包含Name:Total和Price:all Price的总和。如果可能的话,这一行将被冻结。 你有什么想法吗? 简单项目位于此链接中:

编辑1 这是XAML代码:

<DataGrid ItemsSource="{Binding Articles}" AutoGenerateColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Price" Binding="{Binding Price}" />               
        </DataGrid.Columns>
    </DataGrid>

这是ViewModel:

[Export(typeof(IShell))]
public class MainViewModel : Screen
{
    public System.ComponentModel.ICollectionView Articles { get; set; }

    public MainViewModel()
    {
        Articles = CollectionViewSource.GetDefaultView(GetArticles());
    }


    private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80});
        arts.Add(new Article { Name = "Name6", Price = 2.50});
        arts.Add(new Article { Name = "Name7", Price = 0.50 });

        return arts;
    }

}
[导出(类型化(IShell))]
公共类MainViewModel:屏幕
{
public System.ComponentModel.ICollectionView项目{get;set;}
公共主视图模型()
{
Articles=CollectionViewSource.GetDefaultView(GetArticles());
}
私有列表GetArticles()
{
列表艺术=新列表();
新增条款(新条款{Name=“Name1”,价格=2.80});
新增条款(新条款{Name=“Name2”,价格=1.25});
新增条款(新条款{Name=“Name3”,价格=9.32});
新增条款(新条款{Name=“Name4”,价格=1.31});
新增条款(新条款{Name=“Name5”,价格=0.80});
新增条款(新条款{Name=“Name6”,价格=2.50});
新增条款(新条款{Name=“Name7”,价格=0.50});
回归艺术;
}
}

您可以在datagrid下面添加一个文本块,并将其绑定到具有总价的属性,而不是将最后一行添加到datagrid,您可以在datagrid下面添加一个文本块,并将其绑定到具有总价的属性。

这应该会有所帮助。我只添加了一个新行,其中包含一个求和方法

private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80 });
        arts.Add(new Article { Name = "Name6", Price = 2.50 });
        arts.Add(new Article { Name = "Name7", Price = 0.50 });
        arts.Add(new Article {Name = "Total", Price = GetTotal(arts)});
        return arts;
    }

    private double GetTotal(List<Article> arts)
    {
        double Total = 0;
        foreach (Article art in arts)
        {
            Total += double.Parse(art.Price.ToString());
        }
        return Total;
    }
private List GetArticles()
{
列表艺术=新列表();
新增条款(新条款{Name=“Name1”,价格=2.80});
新增条款(新条款{Name=“Name2”,价格=1.25});
新增条款(新条款{Name=“Name3”,价格=9.32});
新增条款(新条款{Name=“Name4”,价格=1.31});
新增条款(新条款{Name=“Name5”,价格=0.80});
新增条款(新条款{Name=“Name6”,价格=2.50});
新增条款(新条款{Name=“Name7”,价格=0.50});
添加(新条款{Name=“Total”,Price=GetTotal(arts)});
回归艺术;
}
私人双GetTotal(列表艺术)
{
双倍合计=0;
foreach(艺术中的文章艺术)
{
Total+=double.Parse(art.Price.ToString());
}
返回总数;
}

关于

这应该会有帮助。我只添加了一个新行,其中包含求和的方法

private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80 });
        arts.Add(new Article { Name = "Name6", Price = 2.50 });
        arts.Add(new Article { Name = "Name7", Price = 0.50 });
        arts.Add(new Article {Name = "Total", Price = GetTotal(arts)});
        return arts;
    }

    private double GetTotal(List<Article> arts)
    {
        double Total = 0;
        foreach (Article art in arts)
        {
            Total += double.Parse(art.Price.ToString());
        }
        return Total;
    }
private List GetArticles()
{
列表艺术=新列表();
新增条款(新条款{Name=“Name1”,价格=2.80});
新增条款(新条款{Name=“Name2”,价格=1.25});
新增条款(新条款{Name=“Name3”,价格=9.32});
新增条款(新条款{Name=“Name4”,价格=1.31});
新增条款(新条款{Name=“Name5”,价格=0.80});
新增条款(新条款{Name=“Name6”,价格=2.50});
新增条款(新条款{Name=“Name7”,价格=0.50});
添加(新条款{Name=“Total”,Price=GetTotal(arts)});
回归艺术;
}
私人双GetTotal(列表艺术)
{
双倍合计=0;
foreach(艺术中的文章艺术)
{
Total+=double.Parse(art.Price.ToString());
}
返回总数;
}
再看一眼:

private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80 });
        arts.Add(new Article { Name = "Name6", Price = 2.50 });
        arts.Add(new Article { Name = "Name7", Price = 0.50 });
        arts.Add(new Article { Name = "Total", Price = arts.Sum(l => l.Price)});
        return arts;
    }
private List GetArticles()
{
列表艺术=新列表();
新增条款(新条款{Name=“Name1”,价格=2.80});
新增条款(新条款{Name=“Name2”,价格=1.25});
新增条款(新条款{Name=“Name3”,价格=9.32});
新增条款(新条款{Name=“Name4”,价格=1.31});
新增条款(新条款{Name=“Name5”,价格=0.80});
新增条款(新条款{Name=“Name6”,价格=2.50});
新增条款(新条款{Name=“Name7”,价格=0.50});
arts.Add(新条款{Name=“Total”,价格=arts.Sum(l=>l.Price)});
回归艺术;
}
还有一个:

private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80 });
        arts.Add(new Article { Name = "Name6", Price = 2.50 });
        arts.Add(new Article { Name = "Name7", Price = 0.50 });
        arts.Add(new Article { Name = "Total", Price = arts.Sum(l => l.Price)});
        return arts;
    }
private List GetArticles()
{
列表艺术=新列表();
新增条款(新条款{Name=“Name1”,价格=2.80});
新增条款(新条款{Name=“Name2”,价格=1.25});
新增条款(新条款{Name=“Name3”,价格=9.32});
新增条款(新条款{Name=“Name4”,价格=1.31});
新增条款(新条款{Name=“Name5”,价格=0.80});
新增条款(新条款{Name=“Name6”,价格=2.50});
新增条款(新条款{Name=“Name7”,价格=0.50});
arts.Add(新条款{Name=“Total”,价格=arts.Sum(l=>l.Price)});
回归艺术;
}

如果你在这里发布代码的简化版本,而不是整个项目的链接,那就更好了好吧,我做到了。我更新了问题如果你在这里发布代码的简化版本,而不是整个项目的链接,那就更好了好吧,我做到了。我免费更新问题的最后一行,创建DataGridRowStyle,添加setter一个ReadOnlyProperty,并与source Name属性和IValueConverter绑定:如果Name==“Total”返回true,否则返回false是一个好的解决方案,但是如果我在datagrid中有一个过滤器,则文章“Total”将丢失?是,他确实禁用了列名中的顺序。第一次,添加带有累加的新行不是一个好主意。我将在网格下添加两个具有此值的文本块。可能是的,您知道如何在网格下添加文本块并绑定到总计?是的,您在ViewModel中添加一个新属性“TotalPrice”,并在arts属性的set方法中重新计算总价。在XAML中,两个texblock,一个带有“total”文本,另一个带有绑定到TotalPrice属性。要免费创建最后一行,请创建DataGridRowStyle,为setter添加一个带有绑定的ReadOnlyProperty,并带有源名称属性和IValueConverter:if Name==“total”返回true,否则返回false