2

数日間、解決できないかなり深刻な問題があります。

ItemsSource別のカスタム型を含むカスタム型の静的プロパティにバインドされたデータグリッドを含む XAML ウィンドウがありますObservableCollection

XAML:

<Window x:Class="TheFaceBook.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TheProject"
    Title="MainWindow" MinHeight="253" MinWidth="882" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="632" d:DesignWidth="933" SizeToContent="WidthAndHeight">
<Window.Resources>
    <local:MainWindow x:Key="mainWindow"/>
</Window.Resources>
<Grid>
    <Button Content="Start" Height="33" Margin="0,28,12,0" VerticalAlignment="Top" Click="BtnStart_Click" HorizontalAlignment="Right" Width="97" />
    <DataGrid Margin="12,110,12,42" AutoGenerateColumns="False" ItemsSource="{Binding CurrentUser.TaggedImages}"  >
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="50" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding AbsoluteURL}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding FacebookURL}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

コード ビハインド プロパティ:

private static User m_CurrentUser;
public static User CurrentUser
{
    get { return MainWindow.m_CurrentUser; }
    set
    {
        MainWindow.m_CurrentUser = value;
    }
}

ユーザークラス:

private ObservableCollection <Picture> m_TaggedImages;

#endregion
#region Properties

public ObservableCollection<Picture> TaggedImages
{
    get { return m_TaggedImages; }
    set 
    { 
        m_TaggedImages = value;
    }
}

画像クラス:

public class Picture : INotifyPropertyChanged
{

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
    private string m_URL;
    private string m_AbsoluteURL;
    private List<User> m_TaggedUsers;

    public List<User> TaggedUsers
    {
        get { return m_TaggedUsers; }
        set 
        {
            m_TaggedUsers = value;
            OnPropertyChanged("TaggedUsers");
        }
    }

    public string AbsoluteURL
    {
        get { return m_AbsoluteURL; }
        set
        {
            m_AbsoluteURL = value;
            OnPropertyChanged("AbsoluteURL");
        }
    }

    public string URL
    {
        get { return m_URL; }
        set
        {
            m_URL = value;
            OnPropertyChanged("URL");
        }
    }
}

TaggedImagse に画像を追加するコード:

bgwDoWork 内:

bgwPictureFinder.ReportProgress(0, pic);

bgwProgressChanged:

static void bgwPictureFinder_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage == 0)
    {
        Picture pic = (Picture)e.UserState;
        MainWindow.CurrentUser.TaggedImages.Add(pic);
    }
}

MainWindow.CurrentUser.TaggedImages他のものから手動でbackgroundworker追加するとうまくいきますが、そこから追加bgwPictureFinder_ProgressChangedすると画像が追加されますMainWindow.CurrentUser.TaggedImages observableCollectionが、UI は更新されずに画像が表示されます。

この問題の原因を突き止めることはできません。

4

3 に答える 3

0

コード例でそれを見逃していると思います:

protected void OnPropertyChanged(string propertyName)
{
   var handlers = PropertyChanged;
   if (handlers != null)
   {
      handlers(this, new PropertyChangedEventArgs(propertyName));
   }
}

バインディングには、双方向モードを使用します。

{Binding..., Mode=TwoWay}
于 2012-09-18T15:23:42.110 に答える
0

WPF upto (v 4.0) が静的プロパティへのデータバインディングをサポートしているかどうかはわかりません。この機能は .NET 4.5 で追加されました。これをチェックして。

WPF バージョン 4.5 の新機能からの引用:

静的プロパティへのバインド

静的プロパティをデータ バインディングのソースとして使用できます。データ バインディング エンジンは、静的イベントが発生した場合にプロパティの値が変更されたことを認識します。たとえば、クラス SomeClass が MyProperty という静的プロパティを定義する場合、SomeClass は、MyProperty の値が変更されたときに発生する静的イベントを定義できます。静的イベントは、次のシグネチャのいずれかを使用できます。

public static event EventHandler MyPropertyChanged;
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

最初のケースでは、クラスは EventArgs をイベント ハンドラーに渡す PropertyNameChanged という名前の静的イベントを公開することに注意してください。2 番目のケースでは、クラスは、PropertyChangedEventArgs をイベント ハンドラーに渡す StaticPropertyChanged という名前の静的イベントを公開します。静的プロパティを実装するクラスは、いずれかの方法を使用してプロパティ変更通知を発生させることを選択できます。

于 2012-09-18T10:31:46.607 に答える
0

新しいオブジェクトを初期化する順序で何かをしなければならないと思います。TaggedImages リストや実際の CurrentUser プロパティなど。確認するのは本当に簡単です。「バインディングのデバッグ」を調べて、何が起こるかを確認してください。

OnPropertyChanged("TaggedImages") も追加します。はい、observableCollection の追加/削除は既に実装されていますが、OnPropertyChanged なしで実際のコレクション参照がいつ変更されたかを WPF が判断できる方法はないと思います。

于 2012-09-18T15:03:20.237 に答える