WPF数据绑定与类的成员变量

时间:2014-09-03 13:48:07

标签: c# wpf binding combobox

我有一个这样的课。

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

我该怎么做?

3 个答案:

答案 0 :(得分:1)

没有viewModel.Sock,因为viewModel是ViewModel类型的对象的集合,它包含该属性。

根据您的目标,有不同的解决方案:

  • 您仍然可以将comboBox绑定到viewModel,但是在comboBox的项模板中,您可以访问Sock属性

  • 您可以创建仅包含Sock对象的新集合...但是您可能必须确保它与ViewModel对象集合同步

答案 1 :(得分:0)

通常你会以稍微不同的方式解决这个问题:

  1. 创建视图(包含所需的所有ui元素的UserControl)
  2. 在新创建的View上将“ViewModel”设置为DataContext(userControl.DataContext = viewModel)
  3. 在您定义组合框的视图中,您现在可以通过Bindings直接引用viewmodel上的“Sock”属性。
  4. 代码:

    <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}}"/>