Usercontrol as datatemplate with bindings

我有一个ItemsSource绑定到SystemModels列表的ItemsControl。 它必须为列表中的每个系统生成一个用户控件。 在这些用户控件中,它有一些文本框显示系统的名称,位置和位置。

我的代码创建usercontrols但不填充usercontrol中的文本框。

视图:

<UserControl x:Name="SystemListScreen">
        <ScrollViewer Grid.Row="1">
                <ItemsControl x:Name="SystemList" ItemsSource="{Binding Path=Systems}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Columns="4"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate DataType="SystemModel">
                        <Widgets:MultiLineButton partID="{Binding ID}"
                                                    company="{Binding ItemsSource.Company}"
                                                    typeSorter="{Binding ItemsSource.Name, ElementName=SystemList}"
                                                    typeLocation="{Binding ItemsSource.Location, ElementName=SystemList}"
                                                    buttonCommand="{Binding DataContext.navigateInspectList, ElementName=SystemListScreen}"
                                                    buttonCommandParameter="{Binding ItemsSource.ID, ElementName=SystemList}"/>
                        <!--<Button Content="{Binding ID}"/>-->
                    </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
        </ScrollViewer>
</UserControl>

视图模型:

private List<SystemModel> systems;

public SystemListViewModel()
{
    Systems = new List<SystemModel>();
    Systems = SystemAPI.Instance.GetSystems();
}

public string App { get; set; }

public List<SystemModel> Systems 
{ 
    get { return systems; }
    private set 
    {
        systems = value;
        NotifyChanged("systems");
        NotifyChanged("NoResultsFound");
    } 
}

多行按钮代码:

        public static readonly DependencyProperty buttonCommandProperty = DependencyProperty.Register("buttonCommand", typeof(ICommand), typeof(MultiLineButton));
    public static readonly DependencyProperty buttonCommandParameterProperty = DependencyProperty.Register("buttonCommandParameter", typeof(Object), typeof(MultiLineButton));
    public static readonly DependencyProperty partIDProperty = DependencyProperty.Register("partID", typeof(String), typeof(MultiLineButton));
    public static readonly DependencyProperty companyProperty = DependencyProperty.Register("company", typeof(String), typeof(MultiLineButton));
    public static readonly DependencyProperty typeSorterProperty = DependencyProperty.Register("typeSorter", typeof(String), typeof(MultiLineButton));
    public static readonly DependencyProperty typeLocationProperty = DependencyProperty.Register("typeLocation", typeof(String), typeof(MultiLineButton));

    public MultiLineButton()
    { 
        this.DataContext = this;

        InitializeComponent();
    }

    public String partID
    {
        get { return (String)GetValue(partIDProperty); }
        set { SetValue(partIDProperty, value); }
    }

    public String company
    {
        get { return (String)GetValue(companyProperty); }
        set { SetValue(companyProperty, value); }
    }

    public String typeSorter
    {
        get { return (String)GetValue(typeSorterProperty); }
        set { SetValue(typeSorterProperty, value); }
    }

    public String typeLocation
    {
        get { return (String)GetValue(typeLocationProperty); }
        set { SetValue(typeLocationProperty, value); }
    }

    public ICommand buttonCommand
    {
        get { return (ICommand)GetValue(buttonCommandProperty); }
        set { SetValue(buttonCommandProperty, value); }
    }
    public Object buttonCommandParameter
    {
        get { return (Object)GetValue(buttonCommandParameterProperty); }
        set { SetValue(buttonCommandParameterProperty, value); }
    }

什么不工作:公司=“{Binding ItemsSource.Company}”,typeSorter =“{Binding ItemsSource.Name,ElementName = SystemList}”,typeLocation =“{Binding ItemsSource.Location,ElementName = SystemList}“和buttonCommandParameter =”{Binding ItemsSource.ID,ElementName = SystemList}“。

但是,如果我只用一个按钮作为Content =“{绑定ID}”的数据模式,它的工作原理是完美的,如果我使用数据模板之外的用户控件,它也可以。 但它不会在数据模板内工作。

我得到的错误是这样的:“BindingExpression路径错误:'公司'属性找不到'对象'''MultiLineButton'(Name ='')'。BindingExpression:Path = Company; DataItem ='MultiLineButton'(Name ='' );目标元素是'MultiLineButton'(Name ='');目标属性是'公司'(类型'String')“

我如何解决这些绑定?


  • 不知道,也许你应该从DateTemplate中删除DataType="SystemModel"
  • 或者尝试使用简单的文本框(Binding id)作为DataTemplate,看看是否仍然是空的。
  • 如果上面没有得到任何帮助,请尝试Snoop(snoopwpf.codeplex.com)看看发生了什么。

  • 尝试ObservableCollection:

    private ObservableCollection<SystemModel> _systems = new ObservableCollection<SystemModel>();
    public ObservableCollection<SystemModel> Systems { get { return _systems; } }
    
    public SystemListViewModel()
    {
        var systems = SystemAPI.Instance.GetSystems();
        foreach (var system in systems)
        {
            Systems.Add(system);
        }
    }
    

    和xaml应该是:

    <UserControl x:Name="SystemListScreen">
            <ScrollViewer Grid.Row="1">
                    <ItemsControl x:Name="SystemList" ItemsSource="{Binding Path=Systems}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <UniformGrid Columns="4"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Widgets:MultiLineButton 
                                    partID="{Binding ID}"
                                    company="{Binding Company}"
                                    typeSorter="{Binding Name}"
                                    typeLocation="{Binding Location}"
                                    buttonCommand="{Binding DataContext.navigateInspectList, 
                                        ElementName=SystemListScreen}"
                                    buttonCommandParameter="{Binding ItemsSource.ID, 
                                        ElementName=SystemList}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
            </ScrollViewer>
    </UserControl>
    

    正如王超所说:

    删除DataType="SystemModel"因为如果您只使用一种DataType作为DataTemplate,则不需要。 正确的语法是DataType="vm:SystemModel" ,其中vm在父标记中定义,如: xmlns:vm="clr-namespace:MySolution.MyVmProject.MyFolder"

    还请检查这些:

    删除ItemsSource. 来自DataTemplate内部的Bindings,因为这只是错误的。

    请仔细检查绑定中的所有名称,因为如果它们错误,则在运行时会考虑空值,您永远不知道。

    检查你的dataContext,确保UserControl的DataContext有正确的类型依赖对象的实例,它有系统。 并确保它仍然是这样。

    链接地址: http://www.djcxy.com/p/44611.html

    上一篇: Usercontrol as datatemplate with bindings

    下一篇: Dependency Property inner Binding in custom control