2013-11-24 43 views
2

我在綁定某些項目屬性時遇到了一些麻煩。WPF DataBinding不更新屬性(僅在啓動時只有一次)

我有一個組合框和項目控件中的按鈕。該組合框用於按名稱搜索地區。這就是爲什麼創建組合框時,屬性IsEditable爲true,以便讓用戶輸入名稱,然後按左控以通過WCF在數據庫中搜索該字符串。

然後,當combobox的ItemSource.Count至少爲1時,我通過設置IsEditable = false(使用按鈕的DataBinding)來阻止組合框。那就是當按鈕必須將可見性從隱藏變爲可見時,因爲再次按下IsEditable按鈕設置爲真,並使用戶輸入名稱進行搜索。

要做到這一點,我已經綁定的組合框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的項目發生變化,也不會轉回去具有影響按鈕知名度的結合? 綁定使用這個轉換器,它也可以工作,但只運行一次,當我運行應用程序。那是I'm有,它只是不更新​​按鈕的知名度問題,並讓它隱:

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

你有一個可觀察的集合被聲明爲局部變量。綁定引擎無法看到它的getter,以便正確訂閱observable的事件! –

回答

1

它的工作原理調用.DataBind ()在cbx時更改ItemSource?

編輯:我會綁定路徑Items.Count的可見性,而不是隻是項目,並使轉換器處理整數而不是項目列表。因爲Count屬性觸發PropertyChanged事件,並且如果添加/刪除元素,列表本身不會。編輯2:將ObservableCollection作爲公共屬性聲明爲該方法本身之外的公共屬性,因此它將具有公共範圍。並將其設置爲ItemsSource。然後,您不必更改ItemSource屬性,只需更改集合本身。

+0

嗨,在WPF控件中沒有方法.DataBind()..或者至少不會出現.. – Andres

+0

嘿,幫助!但是當Items數量爲零並且按鈕可見性必須設置爲Visible時,它不會執行代碼。實際上,它是否在項目源更改時不執行代碼。 – Andres

+0

太棒了!你什麼意思?寫轉換器以便隨時可以執行,並處理轉換器代碼中的零計數 - 或者我誤解了你? – cederlof

相關問題