【问题标题】:C# ListBox/ListView not showing elements - Metro UIC# ListBox/ListView 不显示元素 - Metro UI
【发布时间】:2014-01-02 07:20:50
【问题描述】:

我在 Metro UI 媒体播放器中使用了一个 ListBox,但当我运行它时,ListBox 不显示任何文本。我没有任何错误,但没有文字。我也尝试过使用 ListView 而不是 ListBox,但结果是一样的。我该怎么办?

我在页面的 XAML 部分使用 ListBox 的下一个代码

<ListBox x:Name="ItemListBox">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding PathToFile}"  
                       FontSize="24" Margin="5,0,0,0" TextWrapping="Wrap" />
                        <TextBlock Text="{Binding HasVideo}" 
                       FontSize="16" Margin="15,0,0,0"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

以及页面上的下一个代码 C# 代码:

 public static ListBox ListBoxIstance = null;
 public MainPage()
        {
            InitializeComponent();

            ListBoxIstance = ItemListBox;

            ItemListBox.ItemsSource = Data_Repository.MediaData.MediaList;
            ItemListBox.DataContext = Data_Repository.MediaData.MediaList;

        }

其中 MediaList 是如下声明的列表

public static List<MediaFile> MediaList = new List<MediaFile>();

MediaFile 是一个类

    public class MediaFile
    {
        public TimeSpan Duration = TimeSpan.Zero;

        public bool HasAudio = false;
        public bool HasVideo = false;

        public String PathToFile = null;

        public MediaFile(string _pathToFile)
        {
            PathToFile = _pathToFile;
        }

    }

我正在使用下一个代码来更新 MediaList 和 ItemListBox

foreach (var pathToFile in files)
     {
         MediaList.Add(new MediaFile(pathToFile.Path));
         MainPage.ListBoxIstance.UpdateLayout();
     }

编辑:经过一些建议:

这就是 MediaFile 类的样子:

    public class MediaFile : INotifyPropertyChanged
    {
        private bool _hasAudio;
        public bool HasAudio 
        { 
            get { return _hasAudio; }
            set
            {
                _hasAudio = value;
                OnPropertyChanged("HasAudio");
            } 
        }

        private bool _hasVideo;
        public bool HasVideo
        {
            get { return _hasVideo; }
            set
            {
                _hasVideo = value;
                OnPropertyChanged("HasVideo");
            }
        }

    private String _pathToFile;

    public String PathToFile
    {
        get { return _pathToFile; }
        set
        {
            _pathToFile = value;
            OnPropertyChanged("PathToFile");
        }
    }


        public MediaFile(string pathToFile)
        {
            PathToFile = pathToFile;
        }

    public event PropertyChangedEventHandler PropertyChanged;

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

我正在使用

public static ObservableCollection<MediaFile> MediaList = new ObservableCollection<MediaFile>();

【问题讨论】:

    标签: c# wpf xaml listview microsoft-metro


    【解决方案1】:

    您不能绑定到项目类中的公共字段。将类成员变成公共属性:

    public class MediaFile
    {
        public TimeSpan Duration { get; set; }
        public bool HasAudio { get; set; }
        public bool HasVideo { get; set; }
        public String PathToFile { get; set; }
    
        public MediaFile(string _pathToFile)
        {
            PathToFile = _pathToFile;
        }
    }
    

    然后使用ObservableCollection 而不是List。这将在添加或删除项目时自动更新ItemsSource 绑定。无需调用 UpdateLayout。

    public ObservableCollection<MediaFile> MediaList =
        new ObservableCollection<MediaFile>();
    

    如果您还想在将 MediaFile 对象添加到列表后任何属性值发生更改时更新 UI,您还必须实现 INotifyPropertyChanged 接口:

    public class MediaFile : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string propertyName)
        {
            var propertyChanged = PropertyChanged;
            if (propertyChanged != null)
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        private bool hasVideo
        public bool HasVideo
        {
            get { return hasVideo; }
            set
            {
                 hasVideo = value;
                 OnPropertyChanged("HasVideo"); 
            }
        }
    
        // other properties
    

    }

    【讨论】:

    • 我已经完成了所有的修改,但 ListBox 仍然没有显示任何内容。
    • 它至少应该显示初始值。你真的用过ObservableCollection吗?而且直接设置ItemsSource属性时,不需要设置ListBox的DataContext,无需绑定。
    • 是的,我使用了 ObservableCollection。我删除了 DataContext 行,并按照你告诉我的那样使用了 INotifyPropertyChanged,但屏幕上没有显示任何内容。
    • 好的,我不知道怎么做,但现在可以了。非常感谢!
    【解决方案2】:

    您只能与properties 绑定,而不能与fields 绑定。将字段更改为属性。

    public bool HasVideo {get;set;}
    public String PathToFile {get;set;}
    

    【讨论】:

    • 我已经完成了修改,但列表框仍然没有显示任何内容。
    • 当你设置ItemsSource的列表框时,列表被填充了还是在设置ItemsSource后被填充了?
    • 之后,但我使用的是 MainPage.ListBoxIstance.UpdateLayout();现在我用 ObservableCollection 替换了列表。
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多