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();
    

或者另一种棘手的方法是 OneWayToSource 与 MethodParameters 绑定......

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