我目前正試圖通過的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值)。
有沒有人看到我目前失蹤的錯誤或一些提示?
週末愉快!
丹尼爾
我相信問題是,當您對UserCollection進行更改時,只會觸發CollectionChanged並且此觸發器不會觸發更新。您必須從您的虛擬機中觸發帶有UserCollection名稱的PropertyChanged才能觸發它。 – CrudaLilium
如果你想要一個實際的答案,你需要提供一個更好的問題。包含一個很好的[mcve],它可以可靠地重現問題,並詳細解釋迄今爲止您嘗試調試問題所做的工作。我會指出你使用'UpdateSourceTrigger'和'Mode = TwoWay'似乎是錯誤的。如果彈出式可見性發生變化,您希望轉換器如何處理這個問題?它做了什麼?另外,根據前面的評論,你的綁定需要改變的東西,比如'Count'屬性。請改善你的問題。 –
@CrudaLilium 非常感謝! 在我的虛擬機內觸發一個PropertyChanged事件顯示了您所描述的行爲。 添加/刪除集合中的元素顯然不會爲集合本身觸發propertychanged事件,所以我必須明確地引用它。 希望你有一個愉快的夜晚,並感謝您的幫助! – Daniel