2010-09-20 1 views
0

Я хочу привязать поле со списком к списку Device, List. Я использую,Связывание WPF ComboBox с списком <MyClass> где MyClass не имеет свойств, просто методы

m_ctrlCB.DataContext = m_List; 
m_ctrlCB.DisplayMemberPath = "ToString()"; 
m_ctrlCB.SelectedValuePath = "ToString()"; // do I even need this? 

У меня нет никаких свойств в Приспособление для привязки, и это не мой класс. Тем не менее, они переопределяют ToString для того, что подходит для отображения в combobox (что-то вроде: «Class Device. Number 1».

Однако, то, что я написал, не работает. То, что я вижу в поле со списком, пустое элементы. Мой выбор. Событие смены событий работает. И e.AddedItems [0] действительно является устройством, поэтому я близок. Как я могу получить что-то значимое для отображения в поле combox.

Я полагаю, я был бы счастлив создавая ComboBoxItems и добавляя их в ComboBox, если это необходимо. Но если я иду по этому маршруту, как мне настроить материал Display и сам фактический объект, чтобы я мог его получить, когда пользователь выбирает его из combobox?

Бонусный вопрос . Если я Вместо использования ToString я хочу использовать GetDeviceNumber() и объединить его с моим собственным тестом, чтобы пользователь увидел, Устройство №1 Устройство №2 как бы это сделать?

спасибо, Dave

ответ

3

Вы не должны установить DisplayMemberPath и SelectedValuePath. Поскольку ваш объект устройства переопределяет ToString(), он должен отображать правильную строку самостоятельно.

EDIT:

Чтобы ответить на ваш «бонус вопрос», один из способов сделать это заключается в использовании IValueConverter, который вызывает метод вы заинтересованы в примере кода ниже демонстрирует это.. У меня есть комбобокс, элементы которого представлены TextBlock (который показывает значение для метода ToString()), а также кнопку (которая показывает значение для метода GetDeviceNumber()).

XAML:

<Window x:Class="StackOverflow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:StackOverflow" 
     Title="MainWindow" Height="350" Width="525" 
     x:Name="window"> 
    <ComboBox x:Name="cb"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding}"/> 
        <Button> 
         <Button.Content> 
          <Binding> 
           <Binding.Converter> 
            <local:DeviceValueConverter/> 
           </Binding.Converter> 
          </Binding> 
         </Button.Content> 
        </Button> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
</Window> 

Code-Behind:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.cb.ItemsSource = new List<Device>() 
     { 
      new Device("Device1"), 
      new Device("Device2"), 
      new Device("Device3"), 
     }; 
    } 
} 

public class Device 
{ 
    private string text; 

    public Device(string text) 
    { 
     this.text = text; 
    } 

    public string GetDeviceNumber() { return this.GetHashCode().ToString(); } 
    public override string ToString() { return this.text; } 
} 

public class DeviceValueConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is Device) 
     { 
      return (value as Device).GetDeviceNumber(); 
     } 
     return string.Empty; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 

    #endregion 
} 
+0

karmicpuppet, Спасибо за ответ. Кажется, что все работает хорошо. ИСКЛЮЧАЮЩИЕ Я получаю в элементах combobox, что я настроил в DeviceValueConvert И фактическое значение ToString. Он добавил это без моего запроса. Поэтому я получаю что-то вроде: Class Device. Номер 1 Устройство 1, тогда как я должен просто получить устройство 1. Идеи? – Dave

+0

Я не уверен, что понимаю. Что именно вы хотите отображать в элементах combobox? Вы хотите отобразить ToString()? Или DeviceValue? Если вы хотите просто отобразить ToString(), вы должны делать что-то вроде в ItemTemplate.С другой стороны, если вы хотите показать DeviceValue, ваш XAML должен быть ASanch

+0

Я думаю, что ваше использование Button путало меня. Мне удалось уйти просто с TextBlock и установить Не знаете, почему у вас была кнопка в вашей разметке. Но спасибо, ты решил мою проблему. Отмечено как ответ! – Dave

1

Одним из способов вы могли бы сделать это было бы создать класс-оболочку и обеспечивают соответствующие свойства на нем. Например:

class DeviceWrapper 
{ 
    private Device device; 

    public DeviceWrapper(Device device) 
    { 
     this.device = device; 
    } 

    public int DeviceNumber 
    { 
     return this.device.GetDeviceNumber(); 
    } 

    // etc... 
} 
1

Вам следует попытаться использовать ObjectDataProvider.

Это будет что-то вроде этого

... 
    <UserControl.Resources> 
    <ObjectDataProvider MethodName="GetValues" 
         ObjectType="{x:Type sys:Enum}" 
         x:Key="AlignmentValues"> 
     <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="HorizontalAlignment" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
    </UserControl.Resources> 

    <Border Margin="10" BorderBrush="Aqua" 
      BorderThickness="3" Padding="8"> 
    <StackPanel Width="300"> 
     <TextBlock>bla-bla</TextBlock> 
     <ListBox Name="myComboBox" SelectedIndex="0" Margin="8" 
       ItemsSource="{Binding Source={StaticResource AlignmentValues}}"/> 
     <Button Content="Click Me!" 
       HorizontalAlignment="{Binding ElementName=myComboBox, 
              Path=SelectedItem}"/> 
    </StackPanel> 
    </Border> 
... 
Смежные вопросы