Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 如何将控件绑定到列表<;字符串>;?_C#_Wpf_Mvvm_Inotifypropertychanged_Catel - Fatal编程技术网

C# 如何将控件绑定到列表<;字符串>;?

C# 如何将控件绑定到列表<;字符串>;?,c#,wpf,mvvm,inotifypropertychanged,catel,C#,Wpf,Mvvm,Inotifypropertychanged,Catel,似乎是一个非常基本的MVVM问题,但说到Catel,我在做这件事时遇到了一些问题 我有一个属性-按它应该注册的-它是一个列表,命名为行 我把它绑在一个列表框上 我还有一个按钮,上面有一个向行中添加条目的命令 线被映射到模型,当我检查模型的值时,我看到它在向线添加值时得到正确更新 所以一切似乎都正常,除了修改行时,我的视图没有更新 我试图通过在Lines的setter中添加RaisePropertyChanged(“Lines”)并在命令中为Lines添加新值来解决这个问题 它为属性提供了如下

似乎是一个非常基本的MVVM问题,但说到Catel,我在做这件事时遇到了一些问题

  • 我有一个属性-按它应该注册的-它是一个列表,命名为行
  • 我把它绑在一个列表框上
  • 我还有一个按钮,上面有一个向行中添加条目的命令
  • 线被映射到模型,当我检查模型的值时,我看到它在向线添加值时得到正确更新
所以一切似乎都正常,除了修改行时,我的视图没有更新

我试图通过在Lines的setter中添加RaisePropertyChanged(“Lines”)并在命令中为Lines添加新值来解决这个问题

它为属性提供了如下内容:

[ViewModelToModel("MyModel", "Lines")]
public List<string> Lines
{
    get { return GetValue<List<string>>(LinesProperty); }
    set
    {
        SetValue(LinesProperty, value);
        RaisePropertyChanged("Lines");
    }
}

public static readonly PropertyData LinesProperty =
    RegisterProperty("Lines", typeof(List<string>), null, (s, e) => {});

这很可能是一个非常愚蠢的错误,但我无法理解。我错过了什么?谢谢

您有两种选择来实现此功能:

1) RaisePropertyChanged(()=>行)=>将更新整个集合 2) 使用ObservableCollection而不是List,以便UI能够实际响应更新


我建议使用2。

在视图中尝试将绑定模式设置为双向绑定。像@Kilazur而不是
List
尝试使用。提升
PropertyChanged
将不起作用,因为
不会更改,只会更改其项change@Xeun没有用,我不知道它会怎样@dkozl是的,那将是一种幸福,但我的模型包含一个
列表
。通过
observetecollection
它确实可以完美地更新。我猜你不能通知列表的项目更改,所以我唯一的办法是在AddLine中重新分配列表。当你添加项目而不是属性更改时,你需要提出一个
CollectionChangedEvent
,因为属性行实际上没有更改,所以我知道使用ObservableCollection是最好的方法,但是我的模型包含一个列表,我能做些什么呢?在这种情况下,模型和视图模型之间的映射没有多大意义。在虚拟机上创建一个ObservableCollection,然后在虚拟机的Save()方法中,将对象同步到模型。
public Command AddLine { get; private set; }
private async void OnAddLineExecute()
{
    // this doesn't seem relevant, but since we're talking async and stuff, that may as well be the issue
    if (!lineCountChecked && Lines.Count >= 4)
    {
        if (await messageService.Show(MainDialogs.LineCountCheck, "Lines count", MessageButton.OKCancel, MessageImage.Warning) != MessageResult.OK)
            return;
        else
            lineCountChecked = true;                    
    }
    //

    Lines.Add("New Line");
    RaisePropertyChanged("Lines");
}