我有一个这样的课。
public class ViewModel
{
public PengChat3ClientSock Sock { get; internal set; }
public ObservableCollection<Room> Rooms { get; internal set; }
public ViewModel(PengChat3ClientSock sock)
{
Sock = sock;
Rooms = new ObservableCollection<Room>();
}
}
和MainWindow.xaml.cs
public ObservableCollection<ViewModel> viewModel { get; set; }
(当然是初始化。)
这是一个构造函数。
comboBox.ItemsSource = viewModel;
但是在这里,我不想使用viewModel
,只使用viewModel.Sock
。
我该怎么做?
答案 0 :(得分:1)
没有viewModel.Sock,因为viewModel是ViewModel类型的对象的集合,它包含该属性。
根据您的目标,有不同的解决方案:
您仍然可以将comboBox绑定到viewModel,但是在comboBox的项模板中,您可以访问Sock属性
您可以创建仅包含Sock对象的新集合...但是您可能必须确保它与ViewModel对象集合同步
答案 1 :(得分:0)
通常你会以稍微不同的方式解决这个问题:
代码:
<ComboBox ItemsSource="{Binding Sock}"/>
如果你只是想从代码隐藏设置ItemsSource,这有点难看,你可以简单地将Sock中的项添加到comboBox.Items - 或者你可能需要从代码中创建一个新的'Binding'对象 - 落后,但这更加丑陋:
var binding = new Binding("Sock")
{
Source = viewModel
};
comboBox.ItemsSource = binding;
请注意,我还没有测试过'代码隐藏方法中的绑定',这样做真是一种反模式,特别是如果你正在使用MVVM。
另外,你'Sock'属性是一个类,而不是一个集合,所以你真的不能这样做;你或许是指ViewModel的'Rooms'属性吗?
答案 2 :(得分:0)
您只能将ItemsSource绑定到实现IEnumerable的类型。我之前遇到过这种情况,并制作了一个转换器将任何对象转换为列表。这是一个简单且可重用的解决方案,它将ViewModel逻辑与视图逻辑分开:
转换器:
public class ItemToCollectionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return new List<object> { value };
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML
<UserControl.Resources>
<local:ItemToCollectionConverter x:Key="ItemToCollectionConverter"/>
</UserControl.Resources>
...
<ComboBox ItemsSource="{Binding Sock, Converter={StaticResource ItemToCollectionConverter}}"/>