Серебристый комбинированный ящик ItemTemplate Stuck Отображение первого выбранного элемента - PullRequest
0 голосов
/ 18 января 2011

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

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

Так, например, если я выберу элемент с текстом «Элемент 1», в закрытом поле со списком отобразится «Элемент 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;
        }
    }
}

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

1 Ответ

0 голосов
/ 19 января 2011

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

Целевое свойство, с которым вы связываете поле со списком, должно вызвать событие 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));
}
}

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

Edit2.

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

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

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

...