使用项目动态填充WPF ListView中的ComboBox

时间:2015-12-13 12:37:40

标签: wpf xaml listview binding combobox

我有一个绑定到数据源的WPF ListView。在ListView中是动态创建的ComboBoxes,我想绑定到另一个数据源来提供Items,但SelectedIndex来自第一个数据源(参见下面的XAML)。

目前,如果将ComboBoxItem静态编码到XAML中,则功能正常(如下面的XAML中所示)。但是,我想动态提供ComboBoxItems(字符串列表),所以我可以通过以下方式扩展列表:1)绑定到自定义类(请参阅下面的代码隐藏),或者2)在WindowInitialized中设置DataSource或WindowRendered事件。

我尝试了两种方式,但在这里我展示了我尝试的第一种方法的示例。下面的XAML和VB代码没有错误,但ComboBoxes显示空下拉列表。有什么想法吗?

另外,字符串列表实际上只是一个简单字符串的简单列表(但我想把它列为长列表)。有没有更简单的方法来填充ComboBox? (就个人而言,我认为第二种方法只是创建VB列表并设置数据源非常简单,但结果相同)

编辑:我的解决方案是简单地在ListView的数据源中创建另一个Property(OfType String)并将ComboBox绑定到新的Property。以下是新物业的展示方式:

    Public ReadOnly Property myList As List(Of String)
        Get
            Dim cboxList As New List(Of String)
            For...
                cboxList.Add(New String("..."))
            Next
            Return cboxList
        End Get
    End Property

XAML:

<ListView IsSynchronizedWithCurrentItem="True" Margin="11,5,0,0" x:Name="myList" HorizontalAlignment="Left" Width="130" BorderBrush="{x:Null}" BorderThickness="0" Background="White" Height="240" VerticalAlignment="Top" Grid.Column="1" >
    <ListView.View>
    <GridView AllowsColumnReorder="False">
        <GridViewColumn Header="Freq" Width="55">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
            <ComboBox HorizontalContentAlignment="Center"
                x:Name="_ListFrequencies"
                ItemsSource="{Binding TestStrings}"
                DisplayMemberPath="TestString"
                IsEnabled="{Binding outCustomValue1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                SelectionChanged="_OnSelectionChanged"
                SelectedIndex="{Binding outCustomValue2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                FontSize="10"/>
                                    <!--
                                        <ComboBoxItem Content="test"/>
                                        <ComboBoxItem Content="test"/>
                                        <ComboBoxItem Content="test"/>
                                        -->
            </DataTemplate>
        </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
    </ListView.View>
</ListView>

代码隐藏

Public Class MyComboBoxItems

    Public Property TestStrings() As List(Of MyComboBoxStrings)

    Public Function MyComboBoxItems()
        TestStrings = New List(Of MyComboBoxStrings)
    End Function

End Class

Public Class MyComboBoxStrings

    Public ReadOnly Property TestString As String
        Get
            Return "test"
        End Get
    End Property

End Class

1 个答案:

答案 0 :(得分:0)

  1. 您的场景需要ViewModel。
  2. 对应的C#代码(可以将其用作伪代码):

    public class ViewModel
        {
            public List<MyComboBoxItems> items { get; set; }
            public int outCustomValue2 { get; set; }
            public bool outCustomValue1 { get; set; }
    
            public ViewModel()
            {
                items = new List<MyComboBoxItems>();
                items.Add(new MyComboBoxItems());
                items.Add(new MyComboBoxItems());
                items.Add(new MyComboBoxItems());
                items.Add(new MyComboBoxItems());
            }
        }
    
        public class MyComboBoxItems
        {
            public List<MyComboBoxStrings> TestStrings { get; set; }       
    
            public MyComboBoxItems()
            {
                TestStrings = new List<MyComboBoxStrings>();
                TestStrings.Add(new MyComboBoxStrings("val1"));
                TestStrings.Add(new MyComboBoxStrings("val1"));
                TestStrings.Add(new MyComboBoxStrings("val1"));
                TestStrings.Add(new MyComboBoxStrings("val1"));
            }
        }
    
        public class MyComboBoxStrings
        {
            string _testString;
            public string TestString { get { return _testString; } }
    
            public MyComboBoxStrings(string value)
            {
                _testString = value;
            }
        }
    

    应用DataContext:

     ViewModel vm = new ViewModel();
     myList.DataContext = vm;