WPF用户控件公开内部列表项

WPF用户控件公开内部列表项,wpf,data-binding,user-controls,Wpf,Data Binding,User Controls,我试图编写一个UserControl来显示项目列表,其中每个项目都是一个标题和一组复选框。这个整体将表示一种数据形式,其中填写者回答的问题列表的值为1到4。这一切都可以正常工作,并很好地绑定到窗口的ViewModel 但我目前在UserControl中得到了如下硬编码的答案: <ListBox ItemsPanel="{StaticResource HorizontalScores}" Style="{StaticResource styleOuterListBox}" Ite

我试图编写一个UserControl来显示项目列表,其中每个项目都是一个标题和一组复选框。这个整体将表示一种数据形式,其中填写者回答的问题列表的值为1到4。这一切都可以正常工作,并很好地绑定到窗口的ViewModel

但我目前在UserControl中得到了如下硬编码的答案:

<ListBox
  ItemsPanel="{StaticResource HorizontalScores}"
  Style="{StaticResource styleOuterListBox}"
  ItemContainerStyle="{StaticResource styleOuterListBoxItem}">
  <ListBoxItem>Never</ListBoxItem>
  <ListBoxItem>Sometimes</ListBoxItem>
  <ListBoxItem>Often</ListBoxItem>
  <ListBoxItem>Always</ListBoxItem>
</ListBox>
<ListView
  Name="listviewScores"
  ItemsSource="{Binding Path=Scores}"

  Margin="5"
  BorderThickness="0"
  Background="Transparent"
  Focusable="False"
  Grid.Row="3">
  <ListView.View>
    <GridView
      ColumnHeaderContainerStyle="{StaticResource styleHiddenHeader}">
      <GridView.Columns>

        <GridViewColumn>
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <TextBlock
                Text="{Binding Path=Index}"
                HorizontalAlignment="Right" />
              </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

        <GridViewColumn
          DisplayMemberBinding="{Binding Path=Title}" />

        <GridViewColumn >
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <local:Scorer >
              </local:Scorer>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
      </GridView.Columns>
    </GridView>
  </ListView.View>

</ListView>

从未
有时
经常
总是
我想从窗口的XAML或ViewModel中设置它们,因为它们对于其他形式不同,但看不到正确的咒语。如何从UserControl中删除ListBoxItems并改用数据绑定

大编辑

好的,这是实际的用户控件(看起来很可怕,但这不是重点):


从未
有时
经常
总是
它的名称如下:

<ListBox
  ItemsPanel="{StaticResource HorizontalScores}"
  Style="{StaticResource styleOuterListBox}"
  ItemContainerStyle="{StaticResource styleOuterListBoxItem}">
  <ListBoxItem>Never</ListBoxItem>
  <ListBoxItem>Sometimes</ListBoxItem>
  <ListBoxItem>Often</ListBoxItem>
  <ListBoxItem>Always</ListBoxItem>
</ListBox>
<ListView
  Name="listviewScores"
  ItemsSource="{Binding Path=Scores}"

  Margin="5"
  BorderThickness="0"
  Background="Transparent"
  Focusable="False"
  Grid.Row="3">
  <ListView.View>
    <GridView
      ColumnHeaderContainerStyle="{StaticResource styleHiddenHeader}">
      <GridView.Columns>

        <GridViewColumn>
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <TextBlock
                Text="{Binding Path=Index}"
                HorizontalAlignment="Right" />
              </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

        <GridViewColumn
          DisplayMemberBinding="{Binding Path=Title}" />

        <GridViewColumn >
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <local:Scorer >
              </local:Scorer>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
      </GridView.Columns>
    </GridView>
  </ListView.View>

</ListView>

我想做的是将从不/有时/经常/总是listboxitems从用户控件中硬编码移动到数据绑定


(也欢迎提出“您不想这样做”的建议!)

是否要将集合绑定到列表框

这很简单

<ListBox ItemsSource="{Binding Answers}" />

您的集合在ViewModel中的何处公开

如果您在创建公开ItemsSource的自定义控件时遇到问题,那么您只需要从ItemsControl继承,而不仅仅是从UserControl继承

编辑: 一些假设:

  • ListBox、自定义控件或更高级别父元素的DataContext设置为 视图模型
  • ViewModel有一个 属性称为“答案”
  • Answers属性实现 我数不清

是否要将集合绑定到列表框

这很简单

<ListBox ItemsSource="{Binding Answers}" />

您的集合在ViewModel中的何处公开

如果您在创建公开ItemsSource的自定义控件时遇到问题,那么您只需要从ItemsControl继承,而不仅仅是从UserControl继承

编辑: 一些假设:

  • ListBox、自定义控件或更高级别父元素的DataContext设置为 视图模型
  • ViewModel有一个 属性称为“答案”
  • Answers属性实现 我数不清
    • (一年后…)

      我想你的问题和我的相似。我提出了一种技术,可以在UserControl上公开内部控件的ItemsSource。我的问题链接如下:

      我知道我的解决方案是有效的。我不知道的是,它是否违反了WPF中一些神圣的“最佳实践”。不过感觉不错。

      (一年后……)

      我想你的问题和我的相似。我提出了一种技术,可以在UserControl上公开内部控件的ItemsSource。我的问题链接如下:


      我知道我的解决方案是有效的。我不知道的是,它是否违反了WPF中一些神圣的“最佳实践”。不过感觉是对的。

      这样做,只需确保设置了usercontrol的DataContext。所以在XAML中,YourData包含一个名为Answers的属性,就像SergioL在上面说的那样。@Mark-是的,我只是假设知识…应该是明确的。我真的想绑定到两个集合,一个绑定到显示行的列表框,另一个绑定到显示列的列表框。@amaca-也许你可以重新表述你的问题。列表框没有列标题。如果自定义控件包含标头,则需要公开一个依赖项属性以接受另一个IEnumerable…然后必须在模板中处理该数据。使用此方法,只需确保设置usercontrol的DataContext。所以在XAML中,YourData包含一个名为Answers的属性,就像SergioL在上面说的那样。@Mark-是的,我只是假设知识…应该是明确的。我真的想绑定到两个集合,一个绑定到显示行的列表框,另一个绑定到显示列的列表框。@amaca-也许你可以重新表述你的问题。列表框没有列标题。如果自定义控件包含标题,则需要公开依赖项属性才能接受另一个IEnumerable…然后必须在模板中处理该数据。我一直在努力使用不同的技术将属性公开给内部控件。数据绑定在大多数情况下都可以工作,但是当使用这种类型的数据绑定到可能包含ui元素的项集合时,似乎会出现一些问题。在这种情况下,对这些元素的数据绑定似乎是错误的。我一直在努力使用不同的技术来向内部控件公开属性。数据绑定在大多数情况下都可以工作,但是当使用这种类型的数据绑定到可能包含ui元素的项集合时,似乎会出现一些问题。在这种情况下,对这些元素的数据绑定似乎是错误的。