更新时间:2023-10-07 09:30:04
如果 DataContext 是您的viewmodel(CLoggerViewModel),则Itemssource绑定应为:
if the DataContext is your viewmodel (CLoggerViewModel) then the Itemssource binding should be:
<ListView ItemsSource="{Binding LogEntries}" Margin="5,5,5,5" Grid.Column="1" Grid.Row="0">
并且您的LogEntry的绑定表达式应该只是{Binding LogEntry}
and the binding expression to your LogEntry should simply be {Binding LogEntry}
<GridViewColumn Header="Log Entry" DisplayMemberBinding="{Binding Path=LogEntry}"/>
编辑:
编辑:最新更新
DataContext ={Binding LoggerViewModel - >那是什么?这意味着您需要在当前的Datacontext上使用名为LoggerViewModel的公共属性。我不认为这是你想要的。您的Viewmodel代码看起来不错,但问题是您的XAML和设置您的Datacontext。所以请发布您设置DataContext的代码。
DataContext ="{Binding LoggerViewModel}" --> What is that? this means you need a public property called LoggerViewModel on your current Datacontext. i dont think thats what you want. your Viewmodel code looks ok, but the problem is your XAML and setting your Datacontext. so pls post the code where you set the DataContext.
编辑:工作代码
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ListView ItemsSource="{Binding LogEntries}">
<ListView.View>
<GridView >
<GridViewColumn Header="Log Entry" DisplayMemberBinding="{Binding Path=LogEntry}"/>
</GridView>
</ListView.View>
</ListView>
</Window>
cs
public partial class MainWindow : Window
{
private CLoggerViewModel _vm = new CLoggerViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = _vm;
}
}
public class CLogEntry : INotifyPropertyChanged
{
/// Fields
private string _logEntry;
/// Property
public string LogEntry
{
get { return _logEntry; }
set
{
_logEntry = value;
RaisePropertyChanged("LogEntry");
}
}
/// PropertyChanged event handler
public event PropertyChangedEventHandler PropertyChanged;
/// Constructor
public CLogEntry(string logEntry)
{
this.LogEntry = logEntry;
}
/// Property changed Notification
public void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
class CLoggerViewModel : INotifyPropertyChanged
{
/// Memory Appender object
//private CMemoryAppender _memoryAppender;
/// ObservableCollection for LogEntries
private ObservableCollection<CLogEntry> _logEntries;
/// Property to expose ObservableCollection for UI
public ObservableCollection<CLogEntry> LogEntries
{
get { return _logEntries; }
}
/// Event for PropertyChanged Notification
public event PropertyChangedEventHandler PropertyChanged;
/// Constructor of viewModel
public CLoggerViewModel()
{
this._logEntries = new ObservableCollection<CLogEntry>();
//dunno what CMemoryAppender is
//this._memoryAppender = new CMemoryAppender();
//this._memoryAppender.PropertyChanged += new PropertyChangedEventHandler(OnMemoryAppenderPropertyChanged);
//this._memoryAppender.LogContentChanged += new LoggingEventHandler(OnLogContentChanged);
//thats why i fill my collection here
string[] tmpString = { "A", "B", "C", "D" };
foreach (string s in tmpString)
{
this.LogEntries.Add(new CLogEntry(s));
}
}
/// Any of the properties of the MemoryAppender objects has changed
private void OnMemoryAppenderPropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.RaisePropertyChanged(e.PropertyName);
}
/// PropertyChanged EventHandler
public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}