我有一个组合框和一个要显示的图表(Bar)(通过mvvm模式)。我想做的是::
- 将数据库中的数据加载到组合框中(绑定) - (完成)
- 加载到组合框后,从组合框中选择后,只有在选择组合框值后才会显示图表(未完成)。它没有更新组合框的选择变化
我无法得到正确的流程
viewmodelfile
namespace charting
{
class fbvm : ViewModelBase, INotifyPropertyChanged
{
public String eID;
private List<KeyValuePair<string, float>> _chartData;
public List<KeyValuePair<string, float>> ChartData
{
get
{
return _chartData;
}
set
{
_chartData = value;
OnPropertyChanged(() => ChartData);
}
}
private List<string> _MyComboBoxData;
public List<string> MyComboBoxData
{
get
{
return _MyComboBoxData;
}
set
{
_MyComboBoxData = value;
OnPropertyChanged(() => MyComboBoxData);
}
}
private Boolean _loadoncbsel;
public Boolean loadoncbsel
{
get
{
return _loadoncbsel;
}
set
{
_loadoncbsel = value;
OnPropertyChanged(() => loadoncbsel);
}
}
private string _selectedcb;
public string selectedcb
{
get
{
return _selectedcb;
}
set
{
_selectedcb = value;
OnPropertyChanged(() => selectedcb);
if (value == null)
_loadoncbsel = false;
else
_loadoncbsel = true;
}
}
public fbvm()
{
MyComboBoxData = new List<string>();
comboboxload();
ChartData = new List<KeyValuePair<string, float>>();
}
private void comboboxload()
{
OleDbConnection ConDb;
ConDb = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Admin\\Documents\\Visual Studio 2012\\Projects\\Feedback\\Feedback.accdb");
try
{
ConDb.Open();
OleDbCommand DBSelect = new System.Data.OleDb.OleDbCommand("select FName, LName,ID_NAME from NameList", ConDb);
OleDbDataReader reader = DBSelect.ExecuteReader();
while (reader.Read())
{
string eNAME = "";
eID = reader["ID_NAME"].ToString();
eNAME += reader["FName"].ToString();
eNAME += " " + reader["LName"].ToString();
MyComboBoxData.Add(eNAME);
}
}
catch (Exception ae)
{
MessageBox.Show(ae.Message);
}//catch
}
private void LoadColumnChartData()
{
int cc1=0,tc1=0,aa1=0,blfe1=0,count=0;
float cc11 = 0, tc11 = 0, aa11 = 0, blfe11 = 0;
int year;
OleDbConnection connect = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Admin\Documents\Visual Studio 2012\Projects\Feedback\Feedback.accdb");
connect.Open();
string query = "select CC,TC,AA,BLFE,WMU from "+selectedcb;
OleDbCommand select = new OleDbCommand("select", connect);
select.CommandText = query;
OleDbDataReader reader = select.ExecuteReader();
while (reader.Read())
{
cc1 += Int32.Parse(reader[0].ToString());
tc1 += Int32.Parse(reader[1].ToString());
aa1 += Int32.Parse(reader[2].ToString());
blfe1 += Int32.Parse(reader[3].ToString());
++count;
}
cc11 =(float) cc1 / count; aa11 =(float) aa1 / count;
tc11 =(float) tc1 / count; blfe11 =(float) blfe1 / count;
// cc11 = 3.11f;
// MessageBox.Show(cc11.ToString(), tc11.ToString());
ChartData.Add(new KeyValuePair<string, float>("cc", cc11));
ChartData.Add(new KeyValuePair<string, float>("tc", tc11));
ChartData.Add(new KeyValuePair<string, float>("aa", aa11));
ChartData.Add(new KeyValuePair<string, float>("blfe", blfe11));
ChartData = new List<KeyValuePair<string, float>>(ChartData);
}//loadcoloumnchart
#region INotifyPropertyChanged Members
/// <summary>
/// Need to implement this interface in order to get data binding
/// to work properly.
/// </summary>
/// <param name="propertyName"></param>
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}//class fbvm
}//namespace
xaml文件
<Window x:Class="charting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:DV="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:DVC="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
Title="MainWindow" Height="350" Width="816.045">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="btov"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="83*"/>
<ColumnDefinition Width="434*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Label > Select Name:</Label>
</StackPanel>
<StackPanel Grid.Column="1" >
<ComboBox x:Name="SelectNameCB" SelectedValue="{Binding selectedcb, Mode=TwoWay}" FontSize="15" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="207" ItemsSource="{Binding MyComboBoxData}" />
<DVC:Chart Canvas.Top="80" Canvas.Left="10" Name="mcChart" Margin="10,10,31,0" Height="250"
Background="LightGoldenrodYellow" Title="{Binding Text, ElementName=SelectNameCB}" Visibility="{Binding loadoncbsel, Converter={StaticResource btov}}" >
<DVC:Chart.Series>
<DVC:BarSeries Title="Avg. Score" IndependentValueBinding="{Binding Path=Key}" DependentValueBinding="{Binding Path=Value}" ItemsSource="{Binding ChartData}" Margin="10,10,76,10" AnimationSequence="LastToFirst">
</DVC:BarSeries>
</DVC:Chart.Series>
</DVC:Chart>
</StackPanel>
</Grid>
答案 0 :(得分:1)
组合框:
<ComboBox x:Name="SelectNameCB" FontSize="15" Margin="10,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="207" ItemsSource="{Binding MyComboBoxData}" SelectedItem="{Binding Indexname, Mode=TwoWay}" />
`
答案 1 :(得分:0)
尝试绑定SelectedItem
属性而不是SelectedValue
:
<ComboBox x:Name="SelectNameCB"
SelectedItem="{Binding selectedcb, Mode=TwoWay}"
ItemsSource="{Binding MyComboBoxData}"
...... />
然后在设置selectedcb
属性后,通过调用LoadColumnChartData()
填充图表:
public string selectedcb
{
get{...}
set
{
_selectedcb = value;
OnPropertyChanged(() => selectedcb);
if (value == null)
_loadoncbsel = false;
else
{
_loadoncbsel = true;
LoadColumnChartData();
}
}
}