组合框和图表可见性(mvvm和wpf)

时间:2014-08-30 10:04:15

标签: c# wpf mvvm charts combobox

我有一个组合框和一个要显示的图表(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>

2 个答案:

答案 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();
         }
    }
}