c# - DataBinding 集合和更改集合元素

标签 c# wpf xaml data-binding windows-8.1

我有一个集合和一个 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/

相关文章:

c# - 从 UWP XAML 中的 HyperlinkBut​​ton 中删除下划线

c# - 尝试绑定(bind)到同一用户控件的依赖属性时出错

c# - 使用 BatchBlocks 时如何对数据进行分组?

c# - 以下 C# 代码在多线程环境中是线程安全的吗?

wpf - 在 DataGrid 中绑定(bind) TextBlock 文本和 ComboBox SelectionChanged 事件时遇到问题

c# - Caliburn.Micro 和 Telerik WPF 控件

wpf - 将 Enum 转换为 TextBlock 文本中的字符串

c# - 企业库 5.0 强行关闭事件连接

c# - Interlocked.Decrement(i) 适合 Parallel.ForEach() 吗?

wpf - 如何将样式应用于自定义控件库中的 DependencyObject