C# 组合框和图表可见性(mvvm和wpf)
我有一个组合框和一个图表要按mvvm模式显示。我想做的是:: -将数据从数据库加载到组合框绑定-完成 -加载到组合框后,从组合框中选择后,在查询未完成时选择组合框值后,仅显示图表。它不会在组合框的选择更改时更新 我无法得到这个正确的流程 视图模型文件 xaml文件 尝试绑定SelectedItem属性而不是SelectedValue: 组合框:C# 组合框和图表可见性(mvvm和wpf),c#,wpf,mvvm,charts,combobox,C#,Wpf,Mvvm,Charts,Combobox,我有一个组合框和一个图表要按mvvm模式显示。我想做的是:: -将数据从数据库加载到组合框绑定-完成 -加载到组合框后,从组合框中选择后,在查询未完成时选择组合框值后,仅显示图表。它不会在组合框的选择更改时更新 我无法得到这个正确的流程 视图模型文件 xaml文件 尝试绑定SelectedItem属性而不是SelectedValue: 组合框: `不工作永远不足以诊断问题,更不用说修复问题了。我正在处理这个问题。。。它仍然没有显示图表。我已经检查了参数值。。\u loadoncbsel从未更新
`不工作永远不足以诊断问题,更不用说修复问题了。我正在处理这个问题。。。它仍然没有显示图表。我已经检查了参数值。。\u loadoncbsel从未更新。组合框如何,它是否正确填充?是的。组合框已正确填充。我只是检查一下,它并没有更新_loadoncbseli的真值,如果你把断点放在selectedcb的setter上,它会命中吗?如果是,是否调用了_loadoncbsel的setter?输出窗口中是否有绑定错误消息?
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
<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>
<ComboBox x:Name="SelectNameCB"
SelectedItem="{Binding selectedcb, Mode=TwoWay}"
ItemsSource="{Binding MyComboBoxData}"
...... />
public string selectedcb
{
get{...}
set
{
_selectedcb = value;
OnPropertyChanged(() => selectedcb);
if (value == null)
_loadoncbsel = false;
else
{
_loadoncbsel = true;
LoadColumnChartData();
}
}
}