C# 修改接受参数位于DataTemplate内的Usercontrol

C# 修改接受参数位于DataTemplate内的Usercontrol,c#,wpf,xaml,C#,Wpf,Xaml,我有一个UserControl,它在构造函数中接受了几个参数。因为我现在绑定到ViewModel的集合,所以基于ViewModel加载UserControl的最佳方法似乎是使用DataTemplate 例如 但是,我仍然需要Usercontrol在初始化时具有参数。我怎样才能做到这一点?或者我有什么选择 感谢使用ObjectDataProvider可以实现GUI元素的参数化构造,但不允许使用动态参数值,例如,在项控件中使用下面的数据模板。如果希望传递项特定的参数值,则无法使用项模板 XAML

我有一个UserControl,它在构造函数中接受了几个参数。因为我现在绑定到ViewModel的集合,所以基于ViewModel加载UserControl的最佳方法似乎是使用DataTemplate

例如


但是,我仍然需要Usercontrol在初始化时具有参数。我怎样才能做到这一点?或者我有什么选择


感谢

使用
ObjectDataProvider
可以实现GUI元素的参数化构造,但不允许使用动态参数值,例如,在
项控件中使用下面的数据模板。如果希望传递项特定的参数值,则无法使用项模板

XAML:

<Window x:Class="LDAPAutocomplete.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:LDAPAutocomplete"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="MyContentTemplate">
            <DataTemplate.Resources>
                <ObjectDataProvider x:Key="MyUserControlProvider"
                                    ObjectType="{x:Type local:MyButton}">
                    <ObjectDataProvider.ConstructorParameters>
                        <System:String>Test Me</System:String>
                    </ObjectDataProvider.ConstructorParameters>
                </ObjectDataProvider>
            </DataTemplate.Resources>
            <ContentPresenter
                   Content="{Binding
                        Source={StaticResource MyUserControlProvider}}" />
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <local:LDAPAutocompleteTextBox/>
        <ContentControl
             ContentTemplate="{StaticResource MyContentTemplate}"
                   Content="123"/>
    </StackPanel>
</Window>
public class MyButton : Button
{
    public MyButton(string content)
    {
        this.Content = content;
    }
}

GUI元素的参数化构造可以使用
ObjectDataProvider
,但不允许使用动态参数值,例如,在
ItemsControl中使用下面的数据模板。如果您希望传递特定于项的参数值,则ItemTemplate
是不可能的

XAML:

<Window x:Class="LDAPAutocomplete.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:LDAPAutocomplete"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="MyContentTemplate">
            <DataTemplate.Resources>
                <ObjectDataProvider x:Key="MyUserControlProvider"
                                    ObjectType="{x:Type local:MyButton}">
                    <ObjectDataProvider.ConstructorParameters>
                        <System:String>Test Me</System:String>
                    </ObjectDataProvider.ConstructorParameters>
                </ObjectDataProvider>
            </DataTemplate.Resources>
            <ContentPresenter
                   Content="{Binding
                        Source={StaticResource MyUserControlProvider}}" />
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <local:LDAPAutocompleteTextBox/>
        <ContentControl
             ContentTemplate="{StaticResource MyContentTemplate}"
                   Content="123"/>
    </StackPanel>
</Window>
public class MyButton : Button
{
    public MyButton(string content)
    {
        this.Content = content;
    }
}

您必须在构造函数中传递参数吗?为什么它们不能只是UserControl的属性呢?UserControl有一个gridview,其中的列的顺序基于其中一个参数。还有很多控件的可见性是由参数的类型决定的。虽然我可以用一个转换器来实现可见性,但我想不出对列进行排序的方法。您在.NET4.0中参数化了构造函数,但这是一个非常丑陋的解决方案。考虑在您的控件上使用依赖性属性对我来说是不起作用的(我在模板部分中不支持错误类型“Detag”的标签)。如果你知道一个创建enum和bool依赖属性的好例子,它与传递参数的目的相同,我很想知道。你必须在构造函数中传递参数吗?为什么它们不能只是UserControl的属性呢?UserControl有一个gridview,其中的列的顺序基于其中一个参数。还有很多控件的可见性是由参数的类型决定的。虽然我可以用一个转换器来实现可见性,但我想不出对列进行排序的方法。您在.NET4.0中参数化了构造函数,但这是一个非常丑陋的解决方案。考虑在您的控件上使用依赖性属性对我来说是不起作用的(我在模板部分中不支持错误类型“Detag”的标签)。如果您知道一个创建enum和bool依赖属性的好例子,它与传递参数的目的相同,我很想知道。