我有一个集合和一个 ListView,我已将对象集合绑定(bind)到其中:
<ListView ItemsSource="{Binding Levels}"... />
这是一个级别集合:
private ObservableCollection<Level> _levels;
public ObservableCollection<Level> Levels
{
get { return _levels; }
set { SetProperty(ref _levels, value); }
}
这是一个 Level 类:
public class Level : BindableBase
{
private double _value;
public double Value
{
get { return _value; }
set { SetProperty(ref _value, value); }
}
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set { SetProperty(ref _isChecked, value); }
}
public SolidColorBrush ForegroundColor
{
get { return IsChecked ? new SolidColorBrush(Colors.Yellow) : new SolidColorBrush(Colors.BlueViolet); }
}
}
如果我在集合中添加元素,新元素将显示在ListView中,但是如果我更改集合的现有元素,我看不到任何变化:
private void LvLevels_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (LvLevels.SelectedItem != null)
{
selectedLevel = (Level)LvLevels.SelectedItem;
foreach (var l in viewModel.Levels)
{
if (l.Value == selectedLevel.Value)
l.IsChecked = true; // it doesn't work
else
l.IsChecked = false;
}
// it works
// viewModel.Levels.Add(new Level { Value = 10, IsChecked = true});
}
为什么以及如何解决它?
更新
这是我的项目模板:
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="../Assets/icons/зоны.png"
Margin="10 0 0 0"/>
<TextBlock x:Name="tblock" Text="{Binding Value}" Grid.Column="1" FontSize="30"
Foreground="{Binding ForegroundColor}" />
<!-- Style="{StaticResource ZoneButtonText}" -->
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
最佳答案
如果您希望 ForegroundColor
发生变化(这是猜测),则需要确保 WPF 组件知道它已发生变化。当 IsChecked
更改时,您也需要发送 ForegroundColor
的更改通知。
哦,不要使用 ==
来比较 double 。 double 是floating point变量。
关于c# - DataBinding 集合和更改集合元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273072/