WPF Привязка списка <custom>к комбинированному списку в коде C #? - PullRequest
2 голосов
/ 25 августа 2010

поэтому у меня есть собственный класс в списке. Я, кажется, не могу получить список и комбинированный список, чтобы связать все же. В списке должны отображаться все значения имени пользовательского класса. Я хочу сделать это в коде. Любая помощь наиболее ценится (как всегда!).

Лучше, если я дам несколько фрагментов кода, я думаю.

Класс:

public class Asset : IComparable<Asset>
{

    ...

    public String name { get { return _name; } set { _name = value; } }

    ...
}

Список и моя попытка привязки, это ComboBox.ItemBindingGroupProperty не то?

List<Asset> assetsForCbos = new List<Asset>();
assetsForCbos.Add(new Asset("example asset"));

Binding bindingAssetChoice = new Binding();
bindingAssetChoice.Source = assetsForCbos;
bindingAssetChoice.Path = new PropertyPath("name");
bindingAssetChoice.Mode = BindingMode.OneWay;
cboAsset1.SetBinding(ComboBox.ItemBindingGroupProperty, bindingAssetChoice);

В XAML у меня есть

<ComboBox Height="23"
ItemsSource="{Binding}"
HorizontalAlignment="Left" 
Margin="10,8,0,0" 
Name="cboAsset1" 
VerticalAlignment="Top" 
Width="228" 
IsReadOnly="True" 
SelectedIndex="0"/>

1 Ответ

3 голосов
/ 25 августа 2010

То, что вы можете попробовать, находится в наборе xaml ItemsSource="{Binding}" и в коде позади набора

cboAsset1.DataContext = assetsForCbos;

Лично я предпочитаю выполнять все привязки в Xaml, поэтому, если необходимо внести изменения, мне просто нужно взглянуть на xaml.

РЕДАКТИРОВАТЬ: Если вы хотите показать свойство name вместо Namespace.Asset, вы можете сделать одно из следующих действий

  1. Переопределить ToString в классе Asset, чтобы вернуть имя актива.
    Примечание: Это не изменится, поэтому, если имя изменяется в объекте Asset, это не будет обновляться в представлении.
  2. Создайте DataTemplate, который содержит StackPanel (облегченный контейнер макетов по моему выбору) и TextBlock внутри StackPanel, который привязывается к свойству name. Когда вы создаете ComboBox в коде, вот как вы можете это сделать.

    // Create Data Template
    DataTemplate itemsTemplate = new DataTemplate();
    itemsTemplate.DataType = typeof (Asset);
    
     // Set up stack panel
     FrameworkElementFactory sp = new FrameworkElementFactory(typeof (StackPanel));
     sp.Name = "comboStackpanelFactory";
     sp.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
    
     // Set up textblock
     FrameworkElementFactory assetNameText = new FrameworkElementFactory(typeof (TextBlock));
     assetNameText.SetBinding(TextBlock.TextProperty, new Binding("name"));
     sp.AppendChild(assetNameText);
    
     // Add Stack panel to data template
     itemsTemplate.VisualTree = sp;
    
     // Set the ItemsTemplate on the combo box to the new data tempalte
     comboBox.ItemTemplate = itemsTemplate;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...