嵌套ItemControls上的WPF绑定与子集合

时间:2014-08-04 20:35:51

标签: c# wpf xaml mvvm

我有以下xaml:

<ItemsControl ItemsSource="{Binding ResearchLanguageViewModel.Filters, Mode=OneWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=Type}"></TextBlock>
                <TextBox Text="Search...."></TextBox>
                <ItemsControl>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <CheckBox Content="{Binding Path=Values}"></CheckBox>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

使用以下对象/集合:

public class FilterViewModel
{
    public string Type { get; set; }
    public ObservableCollection<string> Values { get; set; }
}

public class ResearchLanguageViewModel
{
    public int FirmCount { get; set; }
    public ObservableCollection<FilterViewModel> Filters { get; set; } 
}

我正在尝试绑定Filters属性,Type属性很好。但是,我无法将字符串的Values集合显示为一组复选框。不知道我在这里做错了什么......

3 个答案:

答案 0 :(得分:2)

将项控件ItemSource属性绑定到值。

对于字符串,您甚至不需要模板。在您的模型中,您有一组字符串,因此绑定到复选框模板确实提供了一些UI增强功能,但我的下注是您希望在视图模型中显示已检查状态。

您可能需要考虑创建一个对象来封装您的标签和Checked状态,并根据它来定义您的收藏。

public class CheckModel
{
    public string Label {get; set;}
    public bool Checked { get; set; }
}

然后将您的复选框绑定到:

<CheckBox IsChecked="{Binding Checked}" Content="{Binding Label}" />

我希望这会有所帮助。

答案 1 :(得分:2)

视图模型中的

Values是一个数组,您正在尝试(我假设)创建一个Checkboxes数组,其中每个复选框的值都是该数组的索引值。

在模型中,您将值数组传递到一个复选框控件的内容中。您需要做的是将数组绑定到父ItemsSource并将新值绑定到Checkbox控件的内容。像这样:

<ItemsControl ItemsSource="{Binding ResearchLanguageViewModel.Filters, Mode=OneWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=Type}"></TextBlock>
                <TextBox Text="Search...."></TextBox>
                <ItemsControl>
                    <ItemsControl.ItemTemplate ItemsSource={Binding Path=Values}>
                        <DataTemplate>                              
                            <CheckBox Content="{Binding Mode=TwoWay}"></CheckBox>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

答案 2 :(得分:1)

您需要将Values绑定到ItemsControl而不是Checkbox

 <StackPanel>
    <TextBlock Text="{Binding Path=Type}"></TextBlock>
    <TextBox Text="Search...."></TextBox>
    <ItemsControl ItemsSource="{Binding Values}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding}"></CheckBox>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>