簡體   English   中英

WPF數據綁定與類的成員變量

[英]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對象的集合同步

通常,您將以稍微不同的方式進行此操作:

  1. 創建視圖(帶有所需的所有ui元素的UserControl)
  2. 在新創建的視圖上將“ ViewModel”設置為DataContext(userControl.DataContext = viewModel)
  3. 在視圖中定義組合框的位置,現在可以通過綁定直接引用視圖模型上的'Sock'屬性。

碼:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM