2011-01-18 2 views
0

У меня есть Combobox, чей ItemTemplate привязан к DataTemplate, содержащему один из моих собственных элементов управления ярлыками. Все пользовательские элементы управления локализуют назначенный ему контент.Silverlight Combobox ItemTemplate Stuck Отображение первого выбранного элемента

Комбинация (при закрытии) отобразит текст первого выбранного элемента. Однако, когда выбранный элемент изменен, отображение закрытого Combobox не будет обновляться. Я знаю, что фактический выбранный элемент обновлен, потому что он связан с изменением свойства. Единственная проблема - текст дисплея.

Так, например, если я выберу элемент с текстом «Пункт 1», закрытое Combobox отобразит «Item 1». Затем, если я выберу «Item 2», закрытый Combobox все равно отобразит «Item 1».

Вот как это настроить («Name» это свойство элементов привязки в ItemsSource):

<Grid.Resources> 
    <DataTemplate x:Key="MyTemplate"> 
     <MyCustomLabel Content="{Binding Name}" /> 
    <DataTemplate> 
</Grid.Resources> 

<Combobox ItemsSource="{Binding MyItems}" ItemTemplate="{StaticResource MyTemplate}" /> 

Ниже приведен код для моего контроля этикетки:

public class MyLabel : Label 
{ 
    /// <summary> 
    /// When reassigning content in the OnContentChanged method, this will prevent an infinite loop. 
    /// </summary> 
    private bool _overrideOnContentChanged; 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     // if this method has been called recursively (since this method assigns content) 
     // break out to avoid an infinite loop 
     if (_overrideOnContentChanged) 
     { 
      _overrideOnContentChanged = false; 
      return; 
     } 

     base.OnContentChanged(oldContent, newContent); 

     var newContentString = newContent as string; 
     if (newContentString != null) 
     { 
      // convert the string using localization 
      newContentString = LocalizationConverter.Convert(newContentString); 

      // override the content changed method 
      // will prevent infinite looping when this method causes itself to be called again 
      _overrideOnContentChanged = true; 
      Content = newContentString; 
     } 
    } 
} 

Любой совет будет весьма признателен. Благодаря!

+0

Это не ярлык, который должен быть изменен в комбинированном ящике. В комбинированном поле создается метка для каждого элемента в ItemsSource. – Maciek

ответ

0

Выполните двухстороннюю привязку данных к свойству SelectedItem поля со списком.

Свойство target, к которому вы привязываете combo-box, должно поднять событие PropertyChanged.

<ComboBox ItemsSource={Binding Path=Source} SelectedItem={Binding Path=CurrentItem, Mode=TwoWay}/> 


class ComboContext : INotifyPropertyChanged 
{ 
public List<object> Source { get; set; } // attach your source here 
public object CurrentItem { get { return mCurrentItem; } set { mCurrentItem = value; OnPropertyChanged("CurrentItem"); } } // bind to this property 
private object mCurrentItem; 

void OnPropertyChanged(string name) 
{ 
if(PropertyChanged != null) 
PropertyChanged(this, new PropertyChangedEventArgs(name)); 
} 
} 

Пример кода не может быть «полным» - это 1 утра и я любопытное устал, но он должен поставить вас на правильном пути.

Редактировать2.

Только что заметил ваш шаблон, это неправильно, вся идея неправильная.

<ComboBox ItemsSource={Binding Path=Source} SelectedItem={Binding Path=CurrentItem, Mode=TwoWay}> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <TextBlock Text={Binding}/> 
     </Grid> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

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

+0

Две вещи. Первое: у меня нет проблем с привязкой свойства SelectedItem к ComboBox. Я оставил эту часть, чтобы сохранить пример незагроможденным. Два: Мой пример отлично работает с обычным элементом управления Label. Только когда я использую собственный элемент управления ярлыками, я сталкиваюсь с проблемой. Мне интересно, почему это происходит только при использовании пользовательского элемента управления. Спасибо за ответ. – user326502

Смежные вопросы