2014-09-03 33 views
0

我有這樣的一個類。WPF數據綁定類的成員變量

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

我該怎麼做?

+1

你嘗試'comboBox.ItemsSource = viewModel.Sock; '?當然這隻會在'Sock'是一個集合屬性時才起作用。 – Sheridan 2014-09-03 13:53:55

+0

ItemsSource必須是實現IEnumerable的類型。因此,要麼將它變成一個集合,要麼可以創建一個轉換器來爲你做 - 但如果你在XAML中設置綁定,這會更有意義。 – sondergard 2014-09-03 13:55:15

+0

@Sheridan不,Sock只是套接字類。我會更多地考慮它。 – Lee 2014-09-03 13:57:22

回答

1

沒有viewModel.Sock,因爲viewModel是ViewModel類型的對象的集合,它包含該屬性。

根據您的目標有不同的解決方案:

  • 您仍然可以綁定組合框視圖模型,但在組合框中的項目模板,你可以訪問襪子財產

  • 您可以創建將只包含Sock對象的新集合...但是您可能必須確保它與ViewModel對象的集合同步

+0

第一個解決方案對我很有用。非常感謝 – Lee 2014-09-03 14:03:44

0

通常你會去這一個稍微不同的方式:

  1. (你所需要的所有UI元素用戶控件)
  2. 設置你的「視圖模型」作爲DataContext的新創建的視圖創建視圖(userControl.DataContext = viewModel)
  3. 在視圖中,在您定義組合框的位置,您現在可以通過綁定直接引用viewmodel上的'Sock'屬性。

代碼:

<ComboBox ItemsSource="{Binding Sock}"/> 

如果你只是想從代碼隱藏,這是一種醜陋設置的ItemsSource,你可能只是在襪子將商品加入comboBox.Items - 或者,您也可以需要創建一個代碼隱藏一個新的「綁定」對象,但是這甚至是醜陋:

var binding = new Binding("Sock") 
{ 
    Source = viewModel 
}; 
comboBox.ItemsSource = binding; 

請注意,我沒有測試過的「代碼隱藏方法綁定」,這是一個真正的反模式這樣做,特別是如果你是工作的話國王與MVVM。

此外,你的'襪子'屬性是一個類,而不是一個集合,所以你不會真的能夠做到這一點;你是否認爲ViewModel的'房間'屬性?

0

只能將ItemsSource綁定到實現IEnumerable的類型。我之前遇到過這種情況,並創建了一個轉換器將任何對象轉換爲列表。這是一個簡單,可重複使用的解決方案,這使從視圖邏輯分離的視圖模型的邏輯:

轉換器:

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