C#ListBox / ListView没有显示元素 - Metro UI

时间:2013-12-14 15:10:57

标签: c# wpf xaml listview microsoft-metro

我在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>();

2 个答案:

答案 0 :(得分:2)

您无法绑定到项目类中的公共字段。将班级成员转变为公共属性:

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

}

答案 1 :(得分:2)

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

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