Wpf 为用户控件中的控件设置单独的数据绑定

Wpf 为用户控件中的控件设置单独的数据绑定,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我对WPF比较陌生,我正在尝试使用MVVM模式设计我的第一个项目 现在我有了主窗口作为我的视图。我有一个用户控件。现在用户控件有两个扩展器,每个扩展器都需要提取自己的数据 <Expander Header="Electrical Components" Name="EC" IsExpanded="True"> <ItemsControl ItemsSource="{Binding ElecViewModel.Too

我对WPF比较陌生,我正在尝试使用MVVM模式设计我的第一个项目

现在我有了主窗口作为我的视图。我有一个用户控件。现在用户控件有两个扩展器,每个扩展器都需要提取自己的数据

  <Expander Header="Electrical Components" Name="EC"
                  IsExpanded="True">
            <ItemsControl ItemsSource="{Binding ElecViewModel.ToolBoxItems }">
                ............
     <Expander Header="Structural Components" Name="SC"
                  IsExpanded="True">
            <ItemsControl ItemsSource="{Binding StructViewModel.ToolBoxItemsS}">
                .............

............
.............
因此,我创建了两个视图模型,其思想是我可以为每个扩展器进行数据绑定。我们的想法是在每个扩展器下面拉一些图像。 我附加到此视图模型的第一个扩展器

public class ElecViewModel
{
    private List<ToolBoxData> toolBoxItems = new List<ToolBoxData>();
    public ElecViewModel()
    {           
        toolBoxItems.Add(new ToolBoxData("../Images/Inverter.jpg", typeof(InverterDesignerItemViewModel)));          
        toolBoxItems.Add(new ToolBoxData("../Images/Recombiner.jpg", typeof(RecombinerDesignerItemViewModel)));
    }
    public List<ToolBoxData> ToolBoxItems
    {
        get { return toolBoxItems; }
    }
  }
public class StructViewModel
{
    private List<ToolBoxData> toolBoxItemsS = new List<ToolBoxData>();

    public StructViewModel()
    {

        toolBoxItemsS.Add(new ToolBoxData("../Images/SafetySwitch.jpg", typeof(SafetySwitchDesignerItemViewModel)));         
        toolBoxItemsS.Add(new ToolBoxData("../Images/ScadaPanel.jpg", typeof(ScadaDesignerItemViewModel)));
    }

    public List<ToolBoxData> ToolBoxItemsS
    {
        get { return toolBoxItemsS; }
    }
}
公共类ElecViewModel
{
私有列表toolBoxItems=新列表();
公共电气视图模型()
{           
添加(新ToolBoxData(“../Images/Inverter.jpg”,typeof(invertersedSignerItemViewModel));
添加(新ToolBoxData(“../Images/Recombiner.jpg”,typeof(RecombinerDesignerItemViewModel));
}
公共列表ToolBoxItems
{
获取{return toolBoxItems;}
}
}
…和此视图模型的第二个

public class ElecViewModel
{
    private List<ToolBoxData> toolBoxItems = new List<ToolBoxData>();
    public ElecViewModel()
    {           
        toolBoxItems.Add(new ToolBoxData("../Images/Inverter.jpg", typeof(InverterDesignerItemViewModel)));          
        toolBoxItems.Add(new ToolBoxData("../Images/Recombiner.jpg", typeof(RecombinerDesignerItemViewModel)));
    }
    public List<ToolBoxData> ToolBoxItems
    {
        get { return toolBoxItems; }
    }
  }
public class StructViewModel
{
    private List<ToolBoxData> toolBoxItemsS = new List<ToolBoxData>();

    public StructViewModel()
    {

        toolBoxItemsS.Add(new ToolBoxData("../Images/SafetySwitch.jpg", typeof(SafetySwitchDesignerItemViewModel)));         
        toolBoxItemsS.Add(new ToolBoxData("../Images/ScadaPanel.jpg", typeof(ScadaDesignerItemViewModel)));
    }

    public List<ToolBoxData> ToolBoxItemsS
    {
        get { return toolBoxItemsS; }
    }
}
公共类StructViewModel
{
私有列表toolBoxItemsS=新列表();
公共结构视图模型()
{
添加(新ToolBoxData(“../Images/SafetySwitch.jpg”,typeof(SafetySwitchDesignerItemViewModel));
添加(新ToolBoxData(“../Images/ScadaPanel.jpg”,typeof(ScadaDesignerItemViewModel));
}
公共列表ToolboxItems
{
获取{return toolBoxItemsS;}
}
}

现在,我的第一个扩展器正在加载正确的图像,而第二个扩展器没有。第二个视图模型的公共列表不会被点击,即使我像第一个列表一样绑定到它?有一个明显的原因吗?我试着将第二个扩展器的绑定源设置为第一个列表,它被填充,这表明我为第二个列表创建的列表在绑定到控件时存在一些问题。请提出建议,因为我无法识别任何明显的问题。

在您的情况下,不要明确设置
用户控件的
DataContext
。假设您的
MainViewModel
有两个ViewModel实例属性
ElecViewModel
StructViewModel
。而
MainViewModel
窗口的
DataContext
,您可以像这样绑定这些扩展器

<Expander Header="Electrical Components" Name="EC"
                  IsExpanded="True">
            <ItemsControl ItemsSource="{Binding ElecViewModel.ECData}">
            ............
<Expander Header="Structural Components" Name="SC"
                  IsExpanded="True">
            <ItemsControl ItemsSource="{Binding StructViewModel.SCData}">
            .............

............
.............

这就成功了。我在xaml上犯了一些打字错误。