【问题标题】:WPF ListView GridViewColumn BindingWPF ListView GridViewColumn 绑定
【发布时间】:2016-09-23 03:19:28
【问题描述】:

我正在尝试将项目绑定到列中的 ListView。

XAML:

<Grid>
<ListView x:Name="songList">
    <ListView.View>
            <GridView>
                <GridViewColumn Header="Title" Width="200" DisplayMemberBinding="{Binding Title}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

背后的代码:

public List<MediaItem> mIList = new List<MediaItem>();

void refresh()
{
    songList.Items.Clear();
    foreach (KeyValuePair<int, Library.MediaItem> i in ActiveLibrary.Items)
    {
        Library.MediaItem item = i.Value;
        mIList.Add(new MediaItem() { Title = item.Title });
    }
    songList.ItemsSource = mIList;
}


public class MediaItem
{
    public string Title { get; set; }
}

当调用 refresh 时,我希望 MediaItem 的标题显示在它自己的列中(以便我以后可以添加其他属性)。

此时,GridView 只显示 ToString() 结果:

其他问题暗示解决方案与DataContext有关,但我没有找到任何可行的方法。

谢谢。

【问题讨论】:

  • 我尝试了一个带有 get 和 set 访问器的 ObservableCollection,并在初始化程序中将数据上下文设置为自身。它仍然不显示列。

标签: c# wpf listview gridview binding


【解决方案1】:

把这个放在构造函数中: this.DataContext = this;

this.DataContext = this;

在 XAML 中:

<ListView x:Name="songList" ItemsSource="mIList">

使用 ObservableCollection 代替 List。

那么,在刷新方法中你就不需要第一行和最后一行了。

【讨论】:

  • 我必须使用 ItemsSource="{Binding mIList}",它的作用和以前一样
【解决方案2】:

好的,我最终解决了。

我暂时离开了这个项目,专注于学习 MVVM 设计模式并摆脱旧的 WinForms 习惯。

当 MediaItem 类继承 INotifyPropertyChanged(并在属性的设置器中引发 PropertyChanged)时,这将按预期工作。

我不完全确定为什么这是必要的,但它解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2011-06-11
    • 2014-12-08
    • 2019-10-09
    • 2017-09-14
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多