2013-11-24 4 views
2

У меня возникли проблемы с привязкой некоторых атрибутов элементов.WPF DataBinding не обновляет свойство (только один раз при запуске)

У меня есть comboboxes и кнопки в itemcontrol. Комбобокс предназначен для поиска локалей по имени. Поэтому, когда создается combobox, свойство IsEditable истинно, чтобы позволить пользователю ввести имя, а затем нажмите левый элемент управления, чтобы найти эту строку в базе данных через WCF.

Затем, когда combobox ItemSource.Count как минимум 1, я блокирую combobox, установив IsEditable = false (используя DataBinding кнопки). То, когда кнопка должна изменить видимость от скрытого до видимого, потому что нажатие кнопки снова устанавливает значение IsEditable в true и позволяет пользователю вводить имя для поиска.

Для достижения этой цели, я переплетены выпадающий IsEditable с атрибутом видимости кнопки, и используется следующий конвертер, который работает:

using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 

public class VisibilityToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (Visibility)value == Visibility.Visible ? false : true; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

Как я уже говорил, левая кнопка управления искать населенные пункты, на которые I'm с помощью KeyDown события:

private void ComboBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.LeftCtrl) 
    { 
     ComboBox cbx = sender as ComboBox; 
     LocationServiceClient locationService = new LocationServiceClient(); 

     if (cbx != null) 
     { 
      cbx.ItemsSource = locationService.SeachLocalities(new SearchLocalitiesRequest { Search = cbx.Text, MaxItems = 20 }).Localities; 
      cbx.DisplayMemberPath = "LocalityName"; 
      localityCombobox = cbx; 
      cbx.IsDropDownOpen = true; 
     } 
    } 
} 

Как Элементы Combobox изменился, wouldn't, что должно влиять на связывании видимости кнопок? Связывание использует этот конвертер, который работает тоже, но выполняется только один раз, когда я запускаю приложение. То проблема I'm имея, он просто не обновляет видимость кнопки, и оставляет его на Hidden:

public class ItemsSourceCountToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var b = (int)value > 0 ? Visibility.Visible : Visibility.Hidden; 
     return b;  
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

Это изображение контроля, это может помочь вам получить то, что я говорю:

enter image description here

Только в случае, это XAML я использовал:

<ComboBox Name ="cbxLocality" Width="200" DisplayMemberPath="{Binding LocalityName}" IsEditable="{Binding ElementName= btnRemoveLocality, Path=Visibility, Converter={StaticResource VisibilityToBooleanConverter}}" KeyDown="ComboBox_KeyDown"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Text="{Binding LocalityName}"/> 
       <TextBlock FontSize="10"> 
        <Run Text="CP: "/> 
        <Run Text="{Binding ZipCode}"/> 
        <Run Text=" | "/> 
        <Run Text="{Binding Province.ProvinceName}"/>   
       </TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
<Button Name ="btnRemoveLocality" Content="x" Visibility="{Binding ElementName= cbxLocality, Path=Items.Count, Converter={StaticResource ItemsSourceCountToVisibilityConverter}}" Click="Button_Click_3"></Button> 
+0

ваши переменные «населенные пункты» выходят за рамки! –

+0

@GarryVass, что вы имеете в виду? – Andres

+0

У вас есть наблюдаемая коллекция, объявленная как локальная переменная. Механизм привязки не может видеть геттер для него, чтобы сделать правильную подписку на события наблюдаемого! –

ответ

1

работает ли позвонить .DataBind() на cbx при изменении ItemSource?

Редактировать: Я бы привязал видимость к пути Items.Count, а не только к элементам, и сделайте конвертер обработать целое число вместо списка Item. Поскольку свойство Count-свойство запускает событие PropertyChanged, а сам список не будет, если элемент добавлен/удален.

Редактировать 2: Объявить ObservableCollection из ваших элементов как общедоступное свойство вне самого метода, поэтому он будет иметь общий охват. И установите его как ItemsSource. Тогда вам не придется менять свойство ItemSource, а только сама коллекция.

+0

Привет, нет метода .DataBind() в элементе управления WPF .. Или, по крайней мере, не появляется. – Andres

+0

Эй, это помогло! Но он НЕ выполняет код, когда счетчик элементов равен нулю, а видимость кнопки должна быть установлена ​​на «Видимый». На самом деле, не выполняет ли код, когда изменяется элемент itemsource. – Andres

+0

Отлично! Что вы имеете в виду? Запишите конвертер, чтобы он мог выполняться в любое время и обрабатывать нулевой счет внутри кода конвертера - или я вас не понимаю? – cederlof

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