【问题标题】:WPF Observable Collection not updatingWPF Observable Collection 未更新
【发布时间】:2021-12-25 18:47:47
【问题描述】:

我是 WPF 环境中的菜鸟 我一直在寻找解决方案,虽然我确信这只是我还没有理解的非常基本的东西

我正在尝试利用 Observable 集合来更新 Listview 我在视图模型中添加了一个方法,我需要从外部代码调用以将另一个项目添加到列表中。

当我在调试器打开的情况下在 ViewModel 中调用方法 addTask 时,我可以看到它在列表中计数了 1 个项目。但它不会将其添加到 ListView

型号:

    public class Tasks : INotifyPropertyChanged
{
    private string taskName;
    private string fromTime;
    private string toTime;
    private string message;
    private string taskCreator;

    public string TaskName
    {
        get
        {
            return taskName;
        }
        set
        {
            taskName = value;
            OnPropertyChanged("TaskName");
        }
    }
    public string FromTime
    {
        get
        {
            return fromTime;
        }
        set
        {
            fromTime = value;
            OnPropertyChanged("FromTime");
        }
    }
    public string ToTime
    {
        get
        {
            return toTime;
        }
        set
        {
            toTime = value;
            OnPropertyChanged("ToTime");
        }
    }
    public string Message
    {
        get
        {
            return message;
        }
        set
        {
            message = value;
            OnPropertyChanged("Message");
        }
    }
    public string TaskCreator
    {
        get
        {
            return taskCreator;
        }
        set
        {
            taskCreator = value;
            OnPropertyChanged("TaskCreator");
        }
    }
   
    

    #region INotifyPropertyChanged Members  

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

}

视图模型:

    class TasksViewModel 
{


    public TasksViewModel()
    {
        
            {
            _UsersList.Add(new Tasks() { TaskName = "TaskName1", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator1", Message = "Hello" });
            _UsersList.Add(new Tasks() { TaskName = "TaskName2", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator2", Message = "Hello" });
            _UsersList.Add(new Tasks() { TaskName = "TaskName3", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator3", Message = "Hello" });

            
        };
    }

    public ObservableCollection<Tasks> Tasks
    {
        get { return _UsersList; }
        
       
    }
    public ObservableCollection<Tasks> _UsersList { get; set; } = new ObservableCollection<Tasks>();


    public void addTask(string taskName, string fromTime, string toTime, string taskCreator, string message) 
    {
        _UsersList.Add(new Tasks() { TaskName = taskName, FromTime = fromTime, ToTime = toTime, TaskCreator = taskCreator, Message = message });
       
    }

我要更新的列表视图 (Xaml)

  <ListView Name="TaskGrid1" Grid.Row="1" Grid.Column="1" Margin="4,4,12,13"  ItemsSource="{Binding Tasks}" RenderTransformOrigin="0.5,0.5" FontSize="30" >
            <ListView.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform Angle="0"/>
                    <TranslateTransform/>
                </TransformGroup>
            </ListView.RenderTransform>
            <ListView.View>
                <GridView x:Name="List00000600">
                    <GridViewColumn Header="Tid" DisplayMemberBinding="{Binding FromTime}"  Width="100"/>
                    <GridViewColumn Header="Opgave" DisplayMemberBinding="{Binding TaskName}"  Width="350" />
                    <GridViewColumn Header="Opretter" DisplayMemberBinding="{Binding TaskCreator}" Width="120" />
                    
                </GridView>
            </ListView.View>
        </ListView>

【问题讨论】:

  • 那么你在哪里分配DataContext? (这是绑定的默认来源)缺少 xaml 的代码隐藏的地方。
  • 测试了您的代码(并添加了一个调用“addTask”的按钮)并且它可以工作。可能你的虚拟机实例不止一个......所以如何创建和绑定 DataContext 是一个很好的问题......
  • 在 app.xaml 文件中完成:TasksViewModel VM = new TasksViewModel(); window.DataContext = VM;
  • 您有两个公开相同集合的公共属性。 (_UserLists 和任务)。这有点奇怪,您可以完全用 Tasks 替换 _UserLists。但这不是不更新的原因
  • 仔细想想,这很可能是我调用 addTask 的方式不正确。它是用这个类完成的:public async void TasksCreate() { TasksViewModel tasks = new TasksViewModel(); tasks.addTask("Clean", "03:00", "07:00", "Mor", "messsaaaage"); } 这是从外部调用视图模型中的方法的完全错误的方式吗?

标签: c# .net wpf listview observablecollection


【解决方案1】:

我不知道你是如何在 app.xaml 中分配视图模型的。

只需打开 xaml 文件,其中包含您的列表视图并照常构建您的窗口:

<Window
    ... (rest of xmlns) 
    xmlns:MyViewModels="clr-namespace:YourViewModelNamespace"
>
    <Window.DataContext>
        <MyViewModels:TasksViewModel/>
    </Window.DataContext>
    <Grid/Or any container>         
        ...
        <ListView... />
    </Grid/Or any container
</Window>   

如前所述,将 _UserList 替换为 Tasks。

您的异步 TasksCreate() 正在创建 TasksViewModel 的新实例,因此它永远不会更新当前实例。

PS:你可以通过以下方式获取viewmodel:

// this function belongs to mainwindow/anywindow
public void CodeBehindClickEvent(object sender, RoutedEventArgs e)
{
    var VM = (TasksViewModel)this.DataContext;

    VM.addTask("blabla", ...)

    VM.TasksCreate();
}

【讨论】:

  • 谢谢!是的,我突然意识到它可能正在创建视图模型的多个实例!
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多