Как динамически передать значение в ObjectDataProvider.MethodParameters во время выполнения - PullRequest
5 голосов
/ 30 июля 2011

Я написал этот код:

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;
    }
}

и

<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>

Я хочу передать значение моего параметра (здесь 20) динамически (получить от пользователя). Как я могу это сделать?

1 Ответ

5 голосов
/ 30 июля 2011
  1. Задайте некоторое значение по умолчанию для DataProvider, чтобы он уже был настроен и привязан к вашему пользовательскому интерфейсу.

  2. Примите значение от пользователя во время выполнения, а затемпередать это поставщику данных с помощью вызова FindResource и обновить ...

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

Или другой сложный способ - привязка OneWayToSource с MethodParameters ...

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

Но для этого ваш TextBox Text (строка) должен соответствовать типу параметра, который, к сожалению, в нашем случае является целым числом.Чтобы исправить это, создайте конвертер, который позаботится об этой проблеме.

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;
    } 
}
...