C# 在WPF中,从视图类触发数据绑定更新
我正在开发一个WPF应用程序,它在指定的文件夹中显示一个文件名列表框,并有一个修改文件名的按钮。我想更新文件名列表框,以便在单击按钮时反映这一点。在我的ViewModel类中,我通过调用PropertyChanged事件触发更新,但我不知道如何从我的View类中的Button\u Click方法执行等值。该项目的最低代码如下: 视图模型C# 在WPF中,从视图类触发数据绑定更新,c#,wpf,C#,Wpf,我正在开发一个WPF应用程序,它在指定的文件夹中显示一个文件名列表框,并有一个修改文件名的按钮。我想更新文件名列表框,以便在单击按钮时反映这一点。在我的ViewModel类中,我通过调用PropertyChanged事件触发更新,但我不知道如何从我的View类中的Button\u Click方法执行等值。该项目的最低代码如下: 视图模型 class MainWindowViewModel : INotifyPropertyChanged { public event PropertyCh
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private string[] filesList;
public string[] FilesList
{
get => filesList;
set
{
filesList = value;
OnPropertyChanged();
}
}
}
<ListBox x:Name="FilesInCurrentFolder"
ItemsSource="{Binding Files}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type FileItem}">
<TextBlock Text="{Binding FileName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
查看
<ListBox x:Name="FilesInCurrentFolder"
ItemsSource="{Binding FilesList, UpdateSourceTrigger=PropertyChanged}">
</ListBox>
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=新的MainWindowViewModel();
}
私有无效附加日期单击(对象发送方,路由目标)
{
var dateAppender=新的dateAppender(
文件夹。文本,
filesinrrentfolder.SelectedItems.Cast().ToArray();
AppendDates();
//AppendDates()修改文件夹中文件的名称
//因此,需要刷新文件和文件夹数据绑定
}
这是可以做到的,还是我试图以错误的方式处理它?解决方案是创建一个数据模型,例如
FileItem
,当FileItem.FileName
属性更改时,它将引发INotifyPropertyChanged.PropertyChanged
。这将自动更新项目(类型FileItem
)显示在列表框中
FileItem.cs
class FileItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private string fileName;
public string FileName
{
get => fileName;
set
{
fileName = value;
OnPropertyChanged();
}
}
}
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private ObservableColection<FileItem> files;
public ObservableColection<FileItem> Files
{
get => files;
set
{
files = value;
OnPropertyChanged();
}
}
}
MainWindowViewModel.cs
class FileItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private string fileName;
public string FileName
{
get => fileName;
set
{
fileName = value;
OnPropertyChanged();
}
}
}
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private ObservableColection<FileItem> files;
public ObservableColection<FileItem> Files
{
get => files;
set
{
files = value;
OnPropertyChanged();
}
}
}
class MainWindowViewModel:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged([CallerMemberName]字符串名称=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称));
}
私有可观察选择文件;
公共可观察选择文件
{
get=>文件;
设置
{
文件=值;
OnPropertyChanged();
}
}
}
main window.xaml
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private string[] filesList;
public string[] FilesList
{
get => filesList;
set
{
filesList = value;
OnPropertyChanged();
}
}
}
<ListBox x:Name="FilesInCurrentFolder"
ItemsSource="{Binding Files}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type FileItem}">
<TextBlock Text="{Binding FileName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
< /代码>没有一个好的,不可能确切地知道问题是什么。但是,请记住,<代码>文件列表的值不会因为你改变了数组的一个元素而改变。<代码> StababCeleLoope<代码>可能是一个更好的选择,这取决于到底是怎么回事。你甚至可以考虑制作一个LIS。一组INPC模型对象,它们本身不会被替换,而是有一个“文件名”属性,可以根据您的业务逻辑进行更新。