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