Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中,从视图类触发数据绑定更新_C#_Wpf - Fatal编程技术网

C# 在WPF中,从视图类触发数据绑定更新

C# 在WPF中,从视图类触发数据绑定更新,c#,wpf,C#,Wpf,我正在开发一个WPF应用程序,它在指定的文件夹中显示一个文件名列表框,并有一个修改文件名的按钮。我想更新文件名列表框,以便在单击按钮时反映这一点。在我的ViewModel类中,我通过调用PropertyChanged事件触发更新,但我不知道如何从我的View类中的Button\u Click方法执行等值。该项目的最低代码如下: 视图模型 class MainWindowViewModel : INotifyPropertyChanged { public event PropertyCh

我正在开发一个WPF应用程序,它在指定的文件夹中显示一个文件名列表框,并有一个修改文件名的按钮。我想更新文件名列表框,以便在单击按钮时反映这一点。在我的ViewModel类中,我通过调用PropertyChanged事件触发更新,但我不知道如何从我的View类中的Button\u Click方法执行等值。该项目的最低代码如下:

视图模型

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模型对象,它们本身不会被替换,而是有一个“文件名”属性,可以根据您的业务逻辑进行更新。