【问题标题】:How to pass value to ObjectDataProvider.MethodParameters dynamically in runtime如何在运行时动态地将值传递给 ObjectDataProvider.MethodParameters
【发布时间】:2011-07-30 10:06:42
【问题描述】:

我写了这段代码:

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)值(从用户那里获取)。我该怎么做?

【问题讨论】:

    标签: c# wpf c#-4.0 objectdataprovider


    【解决方案1】:
    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;
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      相关资源
      最近更新 更多