2017-04-01 44 views
0

我目前正試圖通過的IValueConverter到Popup.IsOpen屬性一個ObservableCollection綁定,確定集合具有項目(true)還是沒有(假)。失去綁定/對象引用過的IValueConverter結合Popup.IsOpen到一個ObservableCollection時

問題: IValueConverter只會在初始化應用程序時觸發一次,然後再次不會。

查看:

<UserControl x:Class="AutoCompleteTextBox.Views.AutoCompleteTextBoxView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:AutoCompleteTextBox.Views" 
      xmlns:converter="clr-namespace:AutoCompleteTextBox.Converter" 
      xmlns:viewmodels="clr-namespace:AutoCompleteTextBox.ViewModels" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <converter:CollectionHasItemsToBooleanConverter x:Key="collectionHasItemsToBoolean" /> 
    </UserControl.Resources> 

    <UserControl.DataContext> 
     <viewmodels:AutoCompleteTextBoxViewModel /> 
    </UserControl.DataContext> 
    <Grid> 
     <TextBox 
      Name="txtSearchBox"    
      Text="{Binding SearchString,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}" /> 
     <Popup 
      IsOpen="{Binding UserCollection, 
      Converter={StaticResource collectionHasItemsToBoolean},UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
      Width="{Binding ElementName=txtSearchBox,Path=ActualWidth}" 
      PlacementTarget="{Binding ElementName=txtSearchBox}"> 
      <ListView 
       ItemsSource="{Binding UserCollection,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Name,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"> 
         </Label> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </Popup> 
    </Grid> 
</UserControl> 

視圖模型:

public class AutoCompleteTextBoxViewModel : BindableBase 
{ 
    private string searchString; 

    public string SearchString 
    { 
     get { return searchString; } 
     set 
     { 
      if (SetProperty(ref searchString, value)) 
      { 
       if (UserCollection.Count == 3) UserCollection.Clear(); 
       if (searchString != string.Empty) 
       { 
        UserCollection.Add(new UserModel() { Name = DateTime.Now.ToLongTimeString() }); 
       } 
      } 
     } 
    } 

    public ObservableCollection<UserModel> UserCollection { get; set; } 
    public AutoCompleteTextBoxViewModel() 
    { 
     UserCollection = new ObservableCollection<UserModel>();    
    } 
} 

詳情: 類BindableBase實現INotifyPropertChanged,通過使用setter方法裏面的SetProperty解僱。 手動設置PopUp.IsOpen爲true時,所需的彈出窗口正在工作。 將PopUp.IsOpen綁定到ObservableCollection.Count(使用定製的IValueConverter檢查int值)。

有沒有人看到我目前失蹤的錯誤或一些提示?

週末愉快!

丹尼爾

+1

我相信問題是,當您對UserCollection進行更改時,只會觸發CollectionChanged並且此觸發器不會觸發更新。您必須從您的虛擬機中觸發帶有UserCollection名稱的PropertyChanged才能觸發它。 – CrudaLilium

+0

如果你想要一個實際的答案,你需要提供一個更好的問題。包含一個很好的[mcve],它可以可靠地重現問題,並詳細解釋迄今爲止您嘗試調試問題所做的工作。我會指出你使用'UpdateSourceTrigger'和'Mode = TwoWay'似乎是錯誤的。如果彈出式可見性發生變化,您希望轉換器如何處理這個問題?它做了什麼?另外,根據前面的評論,你的綁定需要改變的東西,比如'Count'屬性。請改善你的問題。 –

+0

@CrudaLilium 非常感謝! 在我的虛擬機內觸發一個PropertyChanged事件顯示了您所描述的行爲。 添加/刪除集合中的元素顯然不會爲集合本身觸發propertychanged事件,所以我必須明確地引用它。 希望你有一個愉快的夜晚,並感謝您的幫助! – Daniel

回答

0

從CrudaLilium評論工作:

「我相信問題是,當你正在改變UserCollection僅CollectionChanged被觸發,這個人會不會觸發更新你將不得不解僱。 PropertyChanged與您的虛擬機中的UserCollection名稱進行觸發。「

相關問題