以编程方式在组件和列表中的值之间设置绑定

时间:2011-06-15 11:20:51

标签: silverlight-3.0

我正在Silverlight 3中开发一个应用程序,我有一个动态表单,我从一个属性列表(键值)生成这个表单我想知道,我怎样才能在组件之间设置绑定( CheckBox,TextBox,...)和属性的值?

此代码只是解决方案的第一个近似值,没有明确的代码:

 int numeroFila = 0;
 MainPage rootPage = ((App)Application.Current).RootVisual as MainPage;
        rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Clear();

        foreach (var atributo in ListaAtributos)
        {
            string tipoAtributo = ObtenerDefinicionAtributo(atributo.Key);
            FrameworkElement campoDatos;
            TextBlock bloqueTexto = new TextBlock();
            bloqueTexto.Text = atributo.Key;
            bloqueTexto.Margin = new Thickness(10,3,0,0);

            switch (tipoAtributo)
            {
                case "Boolean":

                    CheckBox campoBooleano = new CheckBox();
                    campoBooleano.Name = atributo.Key;
                    campoBooleano.IsChecked = ObtenerValorCampoBooleano(atributo.Value);
                    campoDatos = campoBooleano;
                    break;

                case "DateTime":

                    DatePicker campoFecha = new DatePicker();
                    try
                    {
                        campoFecha.DisplayDate = DateTime.Parse(atributo.Value);
                    }
                    catch (Exception) 
                    {
                        campoFecha.DisplayDate = DateTime.Now;
                    }
                    campoDatos = campoFecha;
                    break;

                default:

                    TextBox campoTexto = new TextBox();
                    campoTexto.Text = atributo.Value == null ? "" : atributo.Value;
                    campoDatos = campoTexto;
                    break;
            }

            campoDatos.Margin = new Thickness(0,1,10,1);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.RowDefinitions.Add(new RowDefinition());
            Grid.SetColumn(campoDatos, 1);
            Grid.SetColumn(bloqueTexto, 0);
            Grid.SetRow(campoDatos, numeroFila);
            Grid.SetRow(bloqueTexto, numeroFila);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Add(bloqueTexto);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Add(campoDatos);
            numeroFila++;
        }

    }

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这是代码:

        int numeroFila = 0;
        MainPage rootPage = ((App)Application.Current).RootVisual as MainPage;
        rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Clear();

        foreach (var atributo in ListaAtributos)
        {
            string tipoAtributo = ObtenerDefinicionAtributo(atributo.Key);
            FrameworkElement campoDatos;
            TextBlock bloqueTexto = new TextBlock();
            bloqueTexto.Margin = new Thickness(10,3,0,0);
            Binding bind = new Binding();
            bind.Source = atributo;
            bind.Path = new PropertyPath("Key");
            bind.Mode = System.Windows.Data.BindingMode.TwoWay;
            bloqueTexto.SetBinding(TextBlock.TextProperty, bind);


            switch (tipoAtributo)
            {
                case "Boolean":

                    CheckBox campoBooleano = new CheckBox();
                    campoBooleano.Name = atributo.Key;
                    campoBooleano.IsChecked = ObtenerValorCampoBooleano(atributo.Value);
                    bind = new Binding();
                    bind.Source = atributo;
                    bind.Path = new PropertyPath("Value");
                    bind.Mode = System.Windows.Data.BindingMode.TwoWay;
                    campoBooleano.SetBinding(CheckBox.IsCheckedProperty, bind);
                    campoDatos = campoBooleano;
                    break;

                case "DateTime":

                    DatePicker campoFecha = new DatePicker();
                    try
                    {
                        campoFecha.DisplayDate = DateTime.Parse(atributo.Value);
                    }
                    catch (Exception) 
                    {
                        campoFecha.DisplayDate = DateTime.Now;
                    }
                    bind = new Binding();
                    bind.Source = atributo;
                    bind.Path = new PropertyPath("Value");
                    bind.Mode = System.Windows.Data.BindingMode.TwoWay;
                    campoFecha.SetBinding(DatePicker.TextProperty, bind);
                    campoDatos = campoFecha;
                    break;

                default:

                    TextBox campoTexto = new TextBox();
                    atributo.Value = atributo.Value == null ? "" : atributo.Value;
                    bind = new Binding();
                    bind.Source = atributo;
                    bind.Path = new PropertyPath("Value");
                    bind.Mode = System.Windows.Data.BindingMode.TwoWay;
                    campoTexto.SetBinding(TextBox.TextProperty, bind);
                    campoDatos = campoTexto;
                    break;
            }

            //this.GetType().GetProperty("").GetGetMethod().Invoke(new Object(), null);

            campoDatos.Margin = new Thickness(0,1,10,1);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.RowDefinitions.Add(new RowDefinition());
            Grid.SetColumn(campoDatos, 1);
            Grid.SetColumn(bloqueTexto, 0);
            Grid.SetRow(campoDatos, numeroFila);
            Grid.SetRow(bloqueTexto, numeroFila);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Add(bloqueTexto);
            rootPage.NuevoElementoWindowInstance.NuevoElementoInstance.ListadoAtributos.Children.Add(campoDatos);
            numeroFila++;
        }

但是现在,我需要将一个转换器设置为CheckBox,因为al“Values”是字符串,我需要转换string-boolean

提前致谢。