繁体   English   中英

属性绑定在ListBox WPF中不起作用

[英]Property binding not working in ListBox WPF

我试图用包含一个复选框和一个文本块的网格组成的项目填充一个ListBox。 我最初只有一个复选框,但是我需要包装文本,因此我将其更改为带有复选框和文本块的网格,文本块进行了文本包装。

当只是复选框时,绑定起作用,但现在不起作用。 现在,正确数量的项目显示在列表框中,但这只是一个未选中的复选框(即使我将其设置为在后面的代码中选中,请参见下文)和一个空白的文本块。

XAML:

<ListBox 
    x:Name="lstCalibration" 
    Margin="304,95,78,24" 
    Background="#7FFFFFFF" 
    Width="211" 
    HorizontalAlignment="Center" 
    VerticalContentAlignment="Stretch" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Width="auto">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <CheckBox 
                    Content="" 
                    Tag="{Binding Tag}" 
                    IsChecked="{Binding IsChecked}" 
                    Checked="CheckBoxCal_Checked" 
                    Unchecked="CheckBoxCal_Unchecked"
                    Grid.Row="0" Grid.Column="0"
                    />
                <TextBlock 
                    Tag="{Binding Tag}" 
                    Text="{Binding Text}" 
                    TextWrapping="Wrap"
                    Grid.Row="0" 
                    Grid.Column="1"
                    />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

后面的代码:

foreach (Controller item in calList)
{
    //fill listbox with cals and correct checked states
    Grid grid = new Grid();
    CheckBox cb = new CheckBox();
    TextBlock tb = new TextBlock();
    tb.Text = item.Description;
    cb.Tag = tb.Tag = i;
    cb.IsChecked = calChecked[i];
    if (cb.IsChecked == true)
        noneChecked = false;
    i++;

    Grid.SetRow(cb, 0);
    Grid.SetColumn(cb, 0);
    grid.Children.Add(cb);
    Grid.SetRow(tb, 0);
    Grid.SetColumn(tb, 1);
    grid.Children.Add(tb);
    lstCalibration.Items.Add(grid);
}

添加它,然后删除该foreach循环,在该循环中以编程方式创建所有已在DataTemplate设置的内容。 这是一个非常好的DataTemplate ,但是您的代码没有正确使用它。 摆脱 calChecked ; _items[n].IsChecked现在将完成该工作。

您可以随时将新的ListItem添加到_items并将其显示在列表中,或删除现有的ListItem并将其从列表中消失。 那是“可观察的”部分。 由于引发了PropertyChanged事件,如果您从后面的代码中对其中任何一个设置了IsChecked ,则UI中的相应复选框将自动更新。

public class ListItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public String Text { get; set; }

    private bool _isChecked = false;
    public bool IsChecked {
        get { return _isChecked; }
        set {
            _isChecked = value;
            PropertyChanged?.Invoke(this, 
                new PropertyChangedEventArgs(nameof(IsChecked));
        }
    }
}

在您的构造函数中的代码后面:

private ObservableCollection<ListItem> _items;
public MyWindow()
{
    InitializeComponent()

    _items = new ObservableCollection<ListItem>(
        calList.Select(
            cal => new ListItem {
                       Text = cal.Description,
                       IsChecked = cal.WhateverElse
                   }
        ));

    lstCalibration.Items = _items;
}

在以下两个地方对DataTemplate进行了一个小的更改:不要浪费时间绑定Tag 在事件处理程序中(您甚至可能不需要),只需像这样进行转换:

public void CheckBoxCal_Checked(object sender, EventArgs args)
{
    var listItem = ((FrameworkElement)sender).DataContext as ListItem;

    //  Do whatever. listItem.IsChecked will be up to date thanks 
    //  to the binding.
}

XAML:

            <CheckBox 
                Content="" 
                IsChecked="{Binding IsChecked}" 
                Checked="CheckBoxCal_Checked" 
                Unchecked="CheckBoxCal_Unchecked"
                Grid.Row="0" Grid.Column="0"
                />
            <TextBlock 
                Text="{Binding Text}" 
                TextWrapping="Wrap"
                Grid.Row="0" 
                Grid.Column="1"
                />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM