我需要一些幫助才能將ObservableCollection正確綁定到xaml。我可以正確地綁定數據,但是當數據發生變化時,更改並未反映在屏幕上。我已經閱讀過相關的博客,並且似乎已經理解了,但是當試圖將我所瞭解的知識應用到我自己的示例中時,它並不像我想象的那樣工作。將列表框綁定到observablecollection
我有2類水果和水果,其中水果是水果的ObservableCollection其中實現INotifyPropertyChanged
namespace TestCommand.Models
{
public class Fruit:INotifyPropertyChanged
{
private string _fruitname;
public string FruitName
{ get
{
return _fruitname;
}
set
{
if (_fruitname!=value)
{
_fruitname = value;
OnPropertyChanged("FruitName");
}
}
}
private string _fruitcolor;
public string FruitColor
{
get
{
return _fruitcolor;
}
set
{
if (_fruitcolor != value)
{
_fruitcolor = value;
OnPropertyChanged("FruitColor");
}
}
}
private bool _selected;
public bool bSelected
{
get
{
return _selected;
}
set
{
if (_selected != value)
{
_selected = value;
OnPropertyChanged("bSelected");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
if (PropertyChanged!=null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
}
namespace TestCommand.Models
{
public class Fruits
{
private static ObservableCollection<Fruit> _fruitList;
public static void Add(string f, string c)
{
_fruitList.Add(new Fruit
{
FruitName = f,
FruitColor = c,
bSelected = false
});
}
static Fruits()
{
_fruitList = new ObservableCollection<Fruit>();
_fruitList.Add(new Fruit
{
FruitName = "Mango",
FruitColor = "Yellow",
bSelected = false
});
_fruitList.Add(new Fruit
{
FruitName = "Mango",
FruitColor = "Yellow",
bSelected = false
});
_fruitList.Add(new Fruit
{
FruitName = "Water Melon",
FruitColor = "Green",
bSelected = false
});
_fruitList.Add(new Fruit
{
FruitName = "Apple",
FruitColor = "Red",
bSelected = false
});
_fruitList.Add(new Fruit
{
FruitName = "Banana",
FruitColor = "Yellow",
bSelected = false
});
_fruitList.Add(new Fruit
{
FruitName = "Orange",
FruitColor = "Orange",
bSelected = false
});
}
public static ObservableCollection<Fruit> getAllFruit(bool bSelected = false)
{
var result = (bSelected ?
_fruitList.Where(x => x.bSelected = true).ToList<Fruit>()
: _fruitList.ToList<Fruit>());
return new ObservableCollection<Fruit>(result);
}
}
}
我的XAML:
<Window x:Class="TestCommand.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestCommand"
xmlns:MyCommands='clr-namespace:TestCommand.Commands'
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525">
<StackPanel Orientation='Vertical' Margin='10'>
<ListBox x:Name='MyList' ItemTemplate='{StaticResource FruitTemp}'>
</ListBox>
<Button x:Name='AddFruit'
Height='auto'
Width='auto'
Content='Add New Fruit 2'
Margin='0,10,0,0'
Command='{x:Static MyCommands:TestButtonCommand.AddFruit}'>
<Button.CommandBindings>
<CommandBinding Command='{x:Static MyCommands:TestButtonCommand.AddFruit}'
Executed='CommandBinding_Executed'
CanExecute='CommandBinding_CanExecute' />
</Button.CommandBindings>
</Button>
</StackPanel>
</Window>
和後面的代碼:
namespace TestCommand
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyList.ItemsSource = Fruits.getAllFruit();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Fruits.Add("Durian", "Green");
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
}
}
我的項目模板
<Application x:Class="TestCommand.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestCommand"
StartupUri="MainWindow.xaml">
<Application.Resources>
<DataTemplate x:Key='FruitTemp'>
<StackPanel Orientation='Horizontal'
Margin='5'>
<TextBlock x:Name='tbName'
Text='{Binding FruitName}'
Margin='10,0,0,0'
Width='100'/>
<TextBlock x:Name='tbColor'
Text='{Binding FruitColor}'
Margin='10,0,0,0'
Width='100' />
<!--<CheckBox x:Name='cbSelected'
Content='Selected'
Checked='{Binding bSelected}' />-->
</StackPanel>
</DataTemplate>
</Application.Resources>
</Application>
當我點擊按鈕時,我看到項目已添加到集合中,但集合未在列表中刷新。我必須沒有正確地綁定收藏或可能錯過了一些東西,因爲我對wpf很陌生。
你的幫助指出我的俯視是非常讚賞。
只需添加到答案中,當您使用「CollectionViewSource」時,您將能夠在xaml級別進行過濾。然而,CVS與ObservableCollection不太匹配,所以我只會使用某種'IEnumerable',我會把選擇留給你。這是我的2便士。 [這裏](https://wpftutorial.net/DataViews.html)是一個很好的鏈接。 – XAMlMAX
@Ed Plunkett:謝謝你指出這個缺陷。從來沒有想過這個!非常感謝!將嘗試您的建議 – user1205746
@Ed Plunkett:你會介意走我需要採取的步驟,我應該把我的東西轉換成MVVM嗎?如果你沒有時間但主要重要步驟,則不需要詳細說明。我目前有定義來自INotifyPropertyChanged的水果的模型,以及類Fruit作爲ObservableCollection來檢測水果變化的事件。 viewmodel應該如何鏈接到xaml? – user1205746