1

実行時に ListBox を ObservableCollection にバインドしています。ボタンをクリックすると、コレクション内の項目の 1 つが変更されますが、対応する ListBox 項目はそれに応じて更新されません。私はいくつかの同様の SO 記事やその他のヘルプ資料を調べましたが、彼らが要求したことはすべて実行しているように見えますが、うまくいきません。すべてが正しくロードおよびバインドされているように見えますが、コレクション内の項目の「IsLoading」プロパティを変更すると、IsLoading プロパティにバインドされているグリッド (以下の DataTemplate を参照) の可視性は変更されません。

以下は、私の ListBox 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 に答える