6

私はこのコードを書きました:

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)の値を動的に渡したい(ユーザーを取得)。どうすればこれを行うことができますか?

4

1 に答える 1

5
  1. DataProviderにデフォルト値を指定して、UIに既に設定およびバインドされているようにします。

  2. 実行時にユーザーから値を受け入れ、FindResource呼び出しと更新を使用してデータプロバイダーに値を提供します...

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

または、もう1つのトリッキーな方法は、MethodParametersを使用してOneWayToSourceをバインドすることです。

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

ただし、これを機能させるには、TextBoxテキスト(文字列)をパラメータのタイプと一致させる必要があります。残念ながら、この場合は整数です。これを修正するには、この問題を処理するコンバーターを作成します。

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;
    } 
}
于 2011-07-30T10:26:17.603 に答える