C# RX:如果绑定到列表,则组合框为空<;字符串>;|ViewModelViewHost找不到视图模型的有效视图
在C# RX:如果绑定到列表,则组合框为空<;字符串>;|ViewModelViewHost找不到视图模型的有效视图,c#,wpf,data-binding,reactiveui,C#,Wpf,Data Binding,Reactiveui,在视图中,model是一个 public List OperationModes{get;}=Enum.GetNames(typeof(EOperationMode)).ToList(); 我想将其绑定到组合框 反应方式|不起作用 this.OneWayBind(ViewModel,model=>model.OperationModes,window=>window.ComboBoxOperationMode.ItemsSource); 如果使用reactiveUI将列表绑定到组合框,则控
视图中,model
是一个
public List OperationModes{get;}=Enum.GetNames(typeof(EOperationMode)).ToList();
我想将其绑定到组合框
反应方式|不起作用
this.OneWayBind(ViewModel,model=>model.OperationModes,window=>window.ComboBoxOperationMode.ItemsSource);
如果使用reactiveUI
将列表
绑定到组合框
,则控制台输出中会出现以下错误
控制台输出
DefaultViewLocator:无法解析视图模型类型“System.Object”的视图。
DefaultViewLocator:无法解析视图模型类型“System.Object”的视图。
ViewModelViewHost:ViewModelViewHost找不到System.String和value Passthrough类型的视图模型的有效视图。
xaml方式|工作
我怎样才能解决这个问题?或者不能通过reactiveUI
绑定列表
Github问题:由于您的列表是只读的,您可以直接分配ItemsSource,而不需要OneWayBind(通过代码或xaml,就像您已经拥有的那样)。ReactiveUI绑定功能强大,但需要付出代价,所以如果您可以直接分配,那么就这样做。即使您的列表随着时间的推移而改变,您仍然可以借助ObservableCollection而不是list来避免反应式UI绑定。由于您的列表是只读的,您可以直接分配ItemsSource,而不需要单向绑定(通过代码或xaml,就像您已经拥有的那样)。ReactiveUI绑定功能强大,但需要付出代价,所以如果您可以直接分配,那么就这样做。即使您的列表随着时间的推移而改变,您仍然可以借助ObservableCollection而不是list来避免反应式UI绑定。设置组合框的DisplayMemberPath
属性,以避免使用试图解析字符串的视图的ViewModelViewHost
:
<ComboBox x:Name="ComboBoxOperationMode" DisplayMemberPath="." />
设置组合框的DisplayMemberPath
属性,以避免使用试图解析字符串的视图的ViewModelViewHost
:
<ComboBox x:Name="ComboBoxOperationMode" DisplayMemberPath="." />
这意味着,由于性能原因,在任何可能的地方都使用xaml绑定?这是一个我无法通过被动绑定列表的错误吗?请参阅mm8以获得更完整的答案。我不会百分之百同意柯尔特的意见。在wpf的土地上,在初始化的时候有一个轻微的惩罚,否则它是相当有效的。好吧,我不是说它是低效的,否则我不会自己使用它。因此,我同意这是相当有效的。我的观点是,任何东西都有成本,即使成本很小。因此,如果变量或列表不随时间变化,则直接赋值总是更有效。当您在列表项中进行绑定时,这一点变得更为重要。这意味着,出于性能考虑,在任何可能的情况下都可以使用xaml绑定?这是一个我无法通过被动绑定列表的错误吗?请参阅mm8以获得更完整的答案。我不会百分之百同意柯尔特的意见。在wpf的土地上,在初始化的时候有一个轻微的惩罚,否则它是相当有效的。好吧,我不是说它是低效的,否则我不会自己使用它。因此,我同意这是相当有效的。我的观点是,任何东西都有成本,即使成本很小。因此,如果变量或列表不随时间变化,则直接赋值总是更有效。当您在列表项内进行绑定时,这一点变得更加重要。您还可以设置itemtemplate以避免此问题。因为如果您绑定到一个ItemsSource并且不设置任何一个,它会尝试在列表中查找该类型的IViewFor。您还可以设置itemtemplate以避免此问题。因为如果您绑定到一个ItemsSource并且不设置任何一个,它会尝试在列表中查找该类型的IViewFor。就绑定到列表而言。当然可以。你只需要遵循mm8的建议。请注意,如果您更改列表内容,if将不会更新。就绑定到列表而言。当然可以。你只需要遵循mm8的建议。请注意,如果更改列表内容,则不会更新。