将Combobox的Itemsource绑定到方法

时间:2016-01-08 17:41:20

标签: c# wpf combobox

我有一个表格,我有很多组合框,我希望提供模板数据供用户访问或能够输入自己的模板数据。

我的模板数据存储在一个带有Type键和值的表中。

我希望在我的ViewModel中有一个接受Key的方法,并返回一个Combo框使用的列表,如下所示。

public List<string> GetComboBoxList(string type)
    {
        return new List<string>
        {
            "Test1" + type,
            "Test2" + type
        };
    } 

我在表单上创建了一个对象数据提供程序:

<ObjectDataProvider x:Key="dataFromEnum" MethodName="GetComboBoxList">
        <ObjectDataProvider.MethodParameters>
            <system:String>Something</system:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

并试图像这样绑定它:

<ComboBox Grid.Row="0" HorizontalAlignment="Left" Margin="1063,230,0,0" VerticalAlignment="Top" Width="443" Height="96" ItemsSource="{StaticResource dataFromEnum}"/>

但是我在控制器上遇到以下异常:

  

异常:“System.Windows.Data.ObjectDataProvider”类型的对象不能应用于需要“System.Collections.IEnumerable”类型的属性。

我不知道如何传递新参数或选择使用哪个参数。我正在做什么?或者我应该为每个组合框的模板数据都有一个属性吗?

2 个答案:

答案 0 :(得分:0)

我无法理解ObjectDataProviderMethodName指定一个方法,但是在哪个类的实例上调用它? MSDN doesn't say(警告:MSDN的WPF文档似乎是一个故意的笑话)。你可以通过创建一个DataSourceProviderassigning it to ObjectInstance来到达某个地方,但是一旦你进入“创建一个类来创建一个类来创建一个类”的废话,你就会浪费最好的岁月你的生活在整个景观中追逐别人的糟糕设计决定。

无论如何,我找不到任何方法让它在GetComboBoxList()中遇到断点,而且我没有变得更年轻。所以......

正如您所说,执行此操作的常规方法是为viewmodel中的每个列表设置一个属性。

但是如果你有太多的列表是为了方便,或者你想根据参数完全动态地生成列表,那么将一个参数从XAML隐藏回一些C#代码的方法不止一种。

价值转换器是WPF中的一种瑞士军刀,您可以很容易地使用它。

public class ListConverter : IValueConverter
{
    public object Convert(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        var vm = value as MyViewModelType;
        var type = (String)parameter;

        return new List<String>
        {
            "Test1" + type,
            "Test2" + type
        };
    }

    public object ConvertBack(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

查看型号:

//  Nothing!

XAML:

<Window.Resources>
    <local:ListConverter
        x:Key="listConverter"
        />
</Window.Resources>

<!-- ... snip ... -->

<ComboBox
    VerticalAlignment="Top"
    ItemsSource="{Binding Converter={StaticResource listConverter}, ConverterParameter=Foo}"
    />

注意我们没有给Binding一个路径。这样做的结果是,ListConverter.Convert参数传递给value的值将是您的视图模型(或ComboBox的{​​{1}}的任何值,但这应该是真的是viewmodel)。因此,如果您想从视图模型中获取某些东西以用于创建列表,只需将其强制转换并使用它即可。如果没有,请忽略它。

答案 1 :(得分:0)

最新答案,但是原始数据提供程序可以工作,您只需要更改绑定声明为

ItemsSource="{StaticResource dataFromEnum}"

ItemsSource="{Binding Source={StaticResource dataFromEnum}}"