1

我在运行时将我的 ListBox 绑定到 ObservableCollection。单击按钮后,我的集合中的一个项目被修改,但相应的 ListBox 项目不会相应地更新自身。我已经浏览了几篇类似的 SO 文章和其他帮助材料,似乎我正在做他们要求的一切,但没有运气。一切似乎都正确加载和绑定,但是当我更改集合中某个项目的“IsLoading”属性时,绑定到 IsLoading 属性的网格的可见性(请参阅下面的 DataTemplate)不会改变。

以下是我的列表框 XAML:

        <ListBox Name="lstItems">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Name="ListBoxGrid">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="120"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="100"/>
                        </Grid.ColumnDefinitions>
                        <CheckBox Grid.Column="0" IsChecked="{Binding IsSelected}" />
                        <Image Grid.Column="1" Width="50" Stretch="Uniform" Source="{Binding Image}" />
                        <TextBlock Grid.Column="2" Text="{Binding Path=ImageFilePath}" />
                        <Grid Grid.Column="3" Visibility="{Binding IsLoading, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, Mode=TwoWay, BindsDirectlyToSource=True, Converter={StaticResource BooleanToVisibilityConverter1}}">
                            <my:LoadingAnimation x:Name="SendAnimation" VerticalAlignment="Center" HorizontalAlignment="Center" />
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

这是我的BO:

public class Order : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsSelected { get; set; }
    public string ImageFilePath { get; set; }
    public ImageSource Image { get; set; }

    private bool mIsSending = false;
    public bool IsSending
    {
        get { return mIsSending; }
        set
        {
            mIsSending = value;

            if (PropertyChanged != null)
                PropertyChanged(null, new PropertyChangedEventArgs("IsSending"));
        }
    }
}

这就是我创建集合并绑定它的方式:

    ObservableCollection<Order> mOrders = new ObservableCollection<Order>();

    public MainWindow()
    {
        InitializeComponent();

        lstItems.ItemsSource = mOrders;
    }
4

1 回答 1

2

没关系。有时是您花费数小时挖掘问题,最后感到沮丧,将其发布在 SO 上,接下来的 2 分钟您自己解决了问题。对于任何未来的读者来说,唯一的问题是我正在发送null事件PropertyChanged。一旦我将其更改为this,事情就开始像魅力一样发挥作用。

于 2013-01-07T07:30:41.657 回答