2011-05-22 94 views
2

我正在使用MVVM和SL4。我有一个绑定到ItemsControl的VoteResults集合。我想在每个VoteResult项目中添加一个PieChart。 VoteResult项目对象属性如下所示:VotedYes 10; VotedNo 4;弃权2; DidntVote 6;饼图XAML绑定

如何传递这些VoteItem属性值以在XAML中构建饼图的系列ItemSource? 喜欢的东西:

<charting:Chart> 
    <charting:Chart.Series> 
     <charting:PieSeries> 
      <charting:PieSeries.ItemsSource> 
      <controls:ObjectCollection> 

      </controls:ObjectCollection> 
      </charting:PieSeries.ItemsSource> 
     </charting:PieSeries> 
    </charting:Chart.Series> 
</charting:Chart> 
+0

“A PieChart __in__ each ..”?你的意思是你想要为每个饼图添加多个饼图吗?也许不是那听起来不太有用。你什么意思?你真的有多个VoteResult项目吗?或者你是否将一个VoteResult的每个属性都称为“项目”。请准确地说,我们花费了大量的时间与我们的计算机进行交谈,这种方式出于必要的精确性。因此,我们最终倾向于相互精确地交谈,以便不存在歧义。 – AnthonyWJones 2011-05-22 20:22:31

+0

A VoteResult(单数)包含4种可能响应中每一种的计数:是;不;弃权和DidntVote。但是,可以响应多个选票:VoterResultA,VoteResultB,VoteResultC响应VoteA,VoteB,VoteC等。ItemsControl绑定到这些响应的集合。我需要将每个VoteResult(单数)的4个可能答案(Yes,No,Abstain和DidntVote)绑定到饼图。 – Greg 2011-05-22 22:08:15

回答

2

的图表控件都被设计成已processeda并汇总准备演示数据。

听起来对我来说,就像你想让一个PieSeries呈现一系列包含类别“VotedYes”,“VotedNo”,“弃权”和“没有投票”作为其独立值并将投票计数作为依赖值。在这种情况下,您需要将包含这组数据的集合传递给ItemsSource,但单个对象不会这样做。

您需要通过返回类似IEnumerable<KeyValuePair<String, Int32>>的函数来传递VoteResult对象。

public IEnumerable<KeyValuePair<String, Int32>> ProcessVoteResult(VoteResult vr) 
{ 
     yield return new KeyValuePair<String, In232>("Voted Yes", vr.VotedYes); 
     yield return new KeyValuePair<String, In232>("Voted No", vr.VotedNo); 
     yield return new KeyValuePair<String, In232>("Abstained", vr.Abstained); 
     yield return new KeyValuePair<String, In232>("Did Not Vote ", vr.DidntVote); 
} 

现在,你可能会想绑定VoteResult因为你似乎是使用MVVM(从看你的其他问题)。您将需要一个值转换器: -

public class VoteResultToEnumerableConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
       return ProcessVoteResult((VoteResult)value); 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

你将不得不在图表上的某个地方在静态资源这个转换器: -

<local:VoteResultToEnumerableConverter x:Key="vrconv" /> 

然后你的图表看起来像: -

<toolkit:Chart> 
    <toolkit:PieSeries 
     ItemsSource="{Binding SomeVoteResult, Converter={StaticResource vrconv}}" 
     DependentValuePath="Key" 
     IndependendValuePath="Value"/> 
</toolkit:Chart> 
+0

你打败了我,我正在写一个“令人惊讶”的类似答案;)我刚刷新页面,找到了你的答案,荣誉:) – AbdouMoumen 2011-05-22 21:20:48

+0

对不起 - 解释是模棱两可的。是的,你的接吻者看起来像我想要的。 VoteResult的集合,每个VoteResult项目都有一个饼图。 – Greg 2011-05-22 21:40:06

+0

更具体一点。我正在使用MVVM,并且在ItemsSource绑定的视图模型中已经有了一个VoteResults(collection)属性。我的目标是使用此绑定将数据提供给饼图,因为数据已经在VoteResult(单数)属性中。 – Greg 2011-05-22 21:51:12