复选框的WPF绑定列表,其中IsChecked绑定到列表的成员资格

时间:2014-07-04 08:16:05

标签: wpf xaml checkbox binding member

因此,我列出了所有可能的值,以及仅出现一次的出现值列表。与 [A,B,C,D,E]和[D,A],一样,第二个列表中的每个元素也必须是第一个元素的成员。

我想创建一个每个可能值一行的列表视图,其中每一行都是一个复选框,将内容绑定到值的名称,并将IsChecked绑定到类似occuringValues.contains(possibleValue)的内容。在我的例子中,这看起来像:

[x] A

[ ] B

[ ] C

[x] D

[ ] E

选中或取消选中复选框应在发生值列表中添加或删除元素。

我尝试了许多没有太多运气的方法,例如:

创建一个带有字符串和bool(用于IsChecked)的INotifyPropertyChanged实现帮助器类和一个ObservableCollection让我可以控制我的类中的更改,但是类中的更改不会触发我的ObservableCollection的set函数,否则我可以在那里更新我的 [D,A] 列表。

我可以更改我的GUI以简化操作,列出occuringValues并使用possibleValues创建一个comboBox,但如果您对我有所了解,我更喜欢使用复选框。

1 个答案:

答案 0 :(得分:2)

所以我设法以安德鲁斯建议的灵感来解决这个问题。

我添加了一个这样的包装类:

class MyOccExpLimitComment
{
    private ObservableCollection<OccupationalExposureLimitComment> Occuring;

    public MyOccExpLimitComment(ObservableCollection<OccupationalExposureLimitComment> occuring, OccupationalExposureLimitComment inner)
    {
        Occuring = occuring;
        Inner = inner;
    }

    public OccupationalExposureLimitComment Inner { get; set; }
    public bool IsChecked
    {
        get
        {
            return Occuring.Contains(Inner);
        }
        set
        {
            if (value == false)
            {
                if (Occuring.Contains(Inner))
                    Occuring.Remove(Inner);
            }
            else
                if (!Occuring.Contains(Inner))
                    Occuring.Add(Inner);

        }
    }
}

XAML:

<ListView ItemsSource="{Binding Path=MyOccExpLimitComments}" Grid.ColumnSpan="3" Grid.Column="0" HorizontalAlignment="Left" Height="153" Margin="2,2,0,0" Grid.Row="8" VerticalAlignment="Top" Width="296">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="269">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Inner.Title_SV}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

属性:

    private ObservableCollection<MyOccExpLimitComment> myOccExpLimitComments;
    public ObservableCollection<MyOccExpLimitComment> MyOccExpLimitComments
    {
        get
        {
            if (myOccExpLimitComments == null)
                myOccExpLimitComments = new ObservableCollection<MyOccExpLimitComment>(AvailableOccExpLimitComments.Select(c => new MyOccExpLimitComment(OccExpLimitComments, c)));
            return myOccExpLimitComments;
        }

    }

因此,我的集合中的每个元素都通过对集合的Occuring引用了解它在集合中的存在,并在选中/取消选中框时使用setter更新集合。