【问题标题】:DataBinding Collection and change element of collectionDataBinding Collection 和改变集合的元素
【发布时间】:2015-07-28 04:17:55
【问题描述】:

我有一个集合和一个 ListView,我绑定了一个对象集合:

<ListView ItemsSource="{Binding Levels}"... />

这是一个 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});                             
    }

为什么以及如何解决?

更新

这是我的 ItemTemplate:

                      <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>

【问题讨论】:

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


    【解决方案1】:

    如果您预计 ForegroundColor 会发生变化(这是猜测),您需要确保 WPF 组件知道它已经发生了变化。当IsChecked 发生更改时,您也需要发送ForegroundColor 的更改通知。

    哦,不要使用 == 比较双精度数。双打是floating point 变量。

    【讨论】:

    • 是的,我将 ForegroundColor 绑定到 ItemTemplate 中的 TextBox。看起来你是对的。如果我更改l.Value,那么更改就会变得可见。你能解释一下我怎么send a change notification for ForegroundColor when IsChecked changes, too吗?谢谢。
    • 您可以在 IsChecked 设置器中调用 SetProperty 后调用 OnPropertyChanged("ForegroundColor");
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2016-05-30
    • 2011-01-30
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多