我正在寻找一种WPF MVVM友好的方式来实现this。
发布于 2015-12-03 18:54:38
您应该尝试使用实时图表,所有图表都是动态的,并且当数据更改时图表会更新。
https://github.com/beto-rodriguez/Live-Charts
这里有一个例子,当然你可以设置use code make来使它更强大,你应该检查库中包含示例
<liveCharts:BarChart Name="Chart" Grid.Row="1" Grid.Column="0">
<liveCharts:BarChart.Series>
<liveCharts:BarSeries Title="Maria" PrimaryValues="20, 40, 45, 60, 55, 60, 65, 70"></liveCharts:BarSeries>
<liveCharts:BarSeries Title="John" PrimaryValues="30, 35, 43, 68, 65 ,70, 55, 60"></liveCharts:BarSeries>
<liveCharts:LineSeries Title="Averge" PrimaryValues="25, 37.5, 44, 64, 60, 65, 60, 65" AreaOpacity="0"></liveCharts:LineSeries>
</liveCharts:BarChart.Series>
<liveCharts:BarChart.PrimaryAxis>
<liveCharts:Axis Name="PrimaryAxis" Title="Sold Items"></liveCharts:Axis>
</liveCharts:BarChart.PrimaryAxis>
<liveCharts:BarChart.SecondaryAxis>
<liveCharts:Axis Title="Month" Labels="Jan, Feb, Mar, Apr, May, Jun, Ago, Sep, Oct, Nov, Dec"></liveCharts:Axis>
</liveCharts:BarChart.SecondaryAxis>
</liveCharts:BarChart>
发布于 2015-11-27 14:38:55
使用带有2列的网格作为进度条,并使用转换器设置网格列宽。两列之和必须为1*。例如,对于60%,第一列将具有0.6*,第二列将具有0.4*。
<DataGrid x:Name="MyDataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Age" Binding="{Binding Age}" />
<DataGridTemplateColumn Header="Progress">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.Resources>
<local:ProgressConverter x:Key="ProgressConverter" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Progress, Converter={StaticResource ProgressConverter}, ConverterParameter=First}" />
<ColumnDefinition Width="{Binding Progress, Converter={StaticResource ProgressConverter}, ConverterParameter=Second}" />
</Grid.ColumnDefinitions>
<Border Background="Green" Grid.Column="0" />
<TextBlock Text="{Binding Progress, StringFormat=P}" Grid.ColumnSpan="2" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
..。
public class ProgressConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
double progress = (double)value;
if ((string)parameter == "First")
{
return new GridLength(progress, GridUnitType.Star);
}
else if ((string)parameter == "Second")
{
return new GridLength(1 - progress, GridUnitType.Star);
}
}
return new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public double Progress { get; set; }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyDataGrid.ItemsSource = new List<Person>
{
new Person { Name = "David", Age = 23, Progress = 0.42 },
new Person { Name = "Joe", Age = 42, Progress = 0.82 },
new Person { Name = "Barry", Age = 31, Progress = 0.69 },
};
}
}
https://stackoverflow.com/questions/33958866
复制