3

songInfo内部と呼ばれるカスタム クラスを持つ監視可能なコレクションがあります。
にバインドされていListViewます。バインディングのコードは次のとおりです。

C# :

var songData = new ObservableCollection<songInfo>();

public ObservableCollection<songInfo> _songData
{ 
    get 
    { 
        return songData; 
    } 
}

public class songInfo
{
    public string Title { get; set; }
    public string Artist { get; set; }
    public string Album { get; set; }
    public string Location { get; set; }
    public string Ext { get; set; }
    public bool isSongPlaying { get; set; }
}

XAML :

<Window x:Class="Genesis.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Genesis (Alpha)" Height="897" Width="882" Loaded="Window_Loaded"
    DataContext="{Binding RelativeSource={RelativeSource Self}}" Name="Genesis">

    <ListView Margin="12,39,0,0" Name="Library" DataContext="{Binding}" ItemsSource="{Binding _songData}" Height="681" VerticalAlignment="Top" MouseDoubleClick="Library_MouseDoubleClick"  ContextMenu="{StaticResource MyContextMenu}" AlternationCount="2" Background="AliceBlue" HorizontalAlignment="Left" Width="846">
        <ListView.View>
            <GridView x:Name="gvLibrary">
                <GridViewColumn Width="20" Header="hi" DisplayMemberBinding="{Binding isSongPlaying}" x:Name="gvColumnPlaying" />
                <GridViewColumn Width="220" Header="Title" DisplayMemberBinding="{Binding Title}" x:Name="gvColumnTitle" />
                <GridViewColumn Width="180" Header="Artist" DisplayMemberBinding="{Binding Artist}" x:Name="gvColumnArtist" />
                <GridViewColumn Width="180" Header="Album" DisplayMemberBinding="{Binding Album}" x:Name="gvColumnAlbum" />
                <GridViewColumn Width="180" Header="Location" DisplayMemberBinding="{Binding Location}" x:Name="gvColumnLocation" />
                <GridViewColumn Width="80" Header="File Type" DisplayMemberBinding="{Binding Ext}" x:Name="gvColumnFileType" />
            </GridView>
        </ListView.View>
    </ListView>

songInfo は、私のコードの他のポイントに取り込まれます。要素が追加または削除されると、ListView が更新されます。ただし、単にsongInfo.ExtorsongInfo.Locationなどを変更するだけのポイントがあります。これを実行して更新する複雑な方法を見つけましたが、要素を削除して再度追加する必要がありました。

songInfo temp = songData[playing_song_index];
songData.RemoveAt(playing_song_index);
songData.Insert(playing_song_index, new songInfo()
{
    Title = temp.Title,
    Artist = temp.Artist,
    Album = temp.Album,
    Location = temp.Location,
    Ext = temp.Ext,
    isSongPlaying = true
});

それが isSongPlaying を true に変更します。

GridView の 1 つの「列」を更新する簡単な方法はありますか?

4

2 に答える 2

6

クラスsongInfoは を実装する必要がありますINotifyPropertyChanged

このインターフェイスを適切に実装すると、クラスのメンバーへの変更は、バインディングを介してユーザー インターフェイス内に自動的に反映されます。

于 2013-01-26T00:56:16.813 に答える
3

songInfo が INotifyPropertyChanged を使用しない場合、あなたがしていることは機能します。次の方法で少しクリーンアップできます。

var mySong = songData.//get your song
int index = songData.IndexOf( mySong );
songData.Remove( mySong  );
songData.Insert( index, mySong );
于 2013-01-26T00:58:50.427 に答える