2011-07-30 20 views
5

escribí este código:Cómo pasar valor a ObjectDataProvider.MethodParameters dinámicamente en tiempo de ejecución

public class CustomData 
{ 
    public int F1 { get; set; } 
    public int F2 { get; set; } 
    public string F3 { get; set; } 
} 


public class RetrievCustomData : List<CustomData> 
{ 
    public RetrievCustomData GetSome(int i) 
    { 
     for (int j = 0; j < i; j++) 
     { 
      CustomData cd = new CustomData(); 
      Random rnd = new Random(); 
      cd.F1 = j; 
      cd.F2 = rnd.Next(i); 
      cd.F3 = "nima"; 
      this.Add(cd); 
     } 

     return this; 
    } 
} 

y:

<Window.Resources> 
    <ObjectDataProvider x:Key="ADUsers" ObjectType="{x:Type src:RetrievCustomData}" 
       MethodName="GetSome"> 
     <ObjectDataProvider.MethodParameters> 
      <sys:Int32>20</sys:Int32> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

Quiero pasar mi parámetro (en este caso es 20) Valor de forma dinámica (llegar usuario fron). ¿Cómo puedo hacer esto?

thaks

Respuesta

5
  1. de Suministro algún valor por defecto a la DataProvider tal manera que ya es configurada y destinada a la interfaz de usuario.

  2. aceptar un valor de usuario durante la ejecución y luego de suministro que al proveedor de datos mediante una llamada FindResource y refrescar ...

     var myValue = GetFromUser(); 
         ((ObjectDataProvider)this.FindResource("ADUsers")).MethodParameters.Clear(); 
         ((ObjectDataProvider)this.FindResource("ADUsers")).MethodParameters.Add(myValue); 
         ((ObjectDataProvider)this.FindResource("ADUsers")).Refresh(); 
    

Otra forma es complicado a OneWayToSource vinculante con MethodParameters .. .

<TextBox x:Name="UserInput"> 
     <TextBox.Text> 
       <Binding Source="{StaticResource ADUsers}" 
         Path="MethodParameters[0]" 
         BindsDirectlyToSource="True" 
         Mode="OneWayToSource"> 
       </Binding> 
     </TextBox.Text> 
    </TextBox> 

Pero para que esto funcione, el texto Cuadro de texto (cadena) debe ser adaptado al tipo del parámetro que lamentablemente en nuestro caso es entero. Para solucionarlo, cree un convertidor que se encargue de este problema.

public class IntToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int intValue = 0; 

     string strText = value?.ToString(); 

     if (!string.IsNullOrEmpty(strText)) 
     { 
      intValue = int.Parse(strText); 
     } 

     return intValue; 
    } 
} 
Cuestiones relacionadas