为了让您的示例工作,请执行以下操作(在大多数情况下,实现评论者所说的):
的 托管表单的XAML代码 强>
<AControl:UserControl1 x:Name="cboBob" HorizontalAlignment="Left" Margin="100,118,0,0" VerticalAlignment="Top" Width="200" Height="29" SelectedColor="{Binding Path=BeSelected, RelativeSource={RelativeSource AncestorType=Window}}}"/>
模式并不重要,因为MainWindow没有实现INPC,也不知道何时((viewModelBinding)DataContext).Selected(及其,BeSelected)被更改。实际上,就像Joe所说,OneWayToSource不起作用......需要RelativeSource,因为BeSelected是MainWindow的属性 - 而不是MainWindow的DataContext。
的 modelMain 强>
modelMain需要实现IEquatable(就像Janne所评论的那样)。为什么?因为BeSelected = new modelMain(...)创建一个新的modelMain,它不是ComboBox的ItemsSource(ColorList)中的项目之一。新对象可能具有与其中一个项相同的属性值,但不会使它们相等(不同的对象=内存中的不同地址)。 IEquatable让您有机会覆盖它。
public class modelMain : ViewModelBase, IEquatable<modelMain> { ... public bool Equals(modelMain other) { return (HexValue == other.HexValue); } }
viewModelMain的ColorList的setter在应该是“ColorsList”时调用具有属性名称“Colors”的SetProperty。它没有被使用,所以它不能阻止你的例子工作,但它仍然是错误的。