[英]WPF data binding with member variable of class
我有這樣的課。
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
。
我怎樣才能做到這一點?
沒有viewModel.Sock,因為viewModel是ViewModel類型的對象的集合,其中包含該屬性。
根據您的目標,有不同的解決方案:
您仍然可以將comboBox綁定到viewModel,但是在comboBox的項目模板中,您可以訪問Sock屬性。
您可以創建僅包含Sock對象的新集合...,但是隨后可能必須確保它與ViewModel對象的集合同步
通常,您將以稍微不同的方式進行此操作:
碼:
<ComboBox ItemsSource="{Binding Sock}"/>
如果您只想從代碼隱藏中設置ItemsSource,這很丑陋,則可以簡單地將Sock中的項目添加到comboBox.Items-或者,您可能需要從代碼隱藏中創建一個新的“ Binding”對象,但是這甚至更丑陋:
var binding = new Binding("Sock")
{
Source = viewModel
};
comboBox.ItemsSource = binding;
請注意,我還沒有測試“在代碼隱藏方法中進行綁定”,這樣做確實是一種反模式,尤其是在使用MVVM的情況下。
同樣,您的“ Sock”屬性是一個類,而不是一個集合,因此您實際上將無法執行此操作。 您可能是說ViewModel的'Rooms'屬性嗎?
您只能將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}}"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.