【问题标题】:How to notify XAML properties when list data of binding changed?绑定列表数据更改时如何通知 XAML 属性?
【发布时间】:2023-03-16 15:00:02
【问题描述】:

我正在使用以下代码进行绑定

XAML

<StackPanel x:Name="channelsRecordTimeData" Orientation="Vertical">
    <ItemsControl x:Name="channelRecordTimeItems" ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate> 
            <DataTemplate>
                <Grid x:Name="gridChannelRecordTimeItem" Width="{Binding Path=ChannelRecordTimeItemWidth}"                                                                                                                
                      Height="{Binding Path=ChannelRecordTimeItemHeight}" Margin="{Binding Path=ChannelRecordTimeItemsMargin}"
                        HorizontalAlignment="Left" DataContext="{Binding Path=ListRecordTime}">
                    <Grid.Background>
                        <ImageBrush x:Name="gridChannelRecordTimeItemBgr" ImageSource="..\Resources\playback_grid_channel_record_time_item_bgr_normal.png"/>
                    </Grid.Background>                                    
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</StackPanel>

C#

public class DATA
{
    public double ChannelRecordTimeItemWidth { set; get; }
    public double ChannelRecordTimeItemHeight { set; get; }
    public Thickness ChannelRecordTimeItemsMargin { set; get; }
    public List<RecordTime> ListRecordTime { set; get; }

    public DATA()
    {
        ChannelRecordTimeItemWidth = 1000;
        ChannelRecordTimeItemHeight = 20;
        ChannelRecordTimeItemsMargin = new System.Windows.Thickness(0, 0, 0, 0);
        ListRecordTime = null;
    }
}

public static List<DATA> listDATA = new List<DATA>();
for(int i = 0 ; i < 10 ; i++)
{
    DATA data = new DATA();
    listDATA.Add(data);
}
channelRecordTimeItems.ItemsSource = listDATA;
channelRecordTimeItems.Items.Refresh();

当我使用这行代码时,此代码将通知 XAML 更新

listDATA[0].ChannelRecordTimeItemWidth -= 15;

当我们在 listDATA 上操作时,有任何方法可以自动更新 XAML 属性

listDATA.RemoveAt();
listDATA.Add();
listDATA.Clear();

不调用以下两行代码

channelRecordTimeItems.ItemsSource = listDATA;
channelRecordTimeItems.Items.Refresh();

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    GUI 将仅在underlying source collection is implementing INotifyCollectionChanged 引发 CollectionChanged 事件以刷新 GUI 组件的情况下更新。

    您可以使用内部为您提供此功能的ObservableCollection

    替换

    public static List<DATA> listDATA = new List<DATA>();
    

    public static ObservableCollection<DATA> listDATA = new ObservableCollection<DATA>();
    

    【讨论】:

    • 您只需将List&lt;T&gt; 替换为ObservableCollection&lt;T&gt;。休息会照常工作。
    • 最后也可以参考例子here
    • 谢谢!我已阅读,但我不知道如何解决我的问题。也就是说,当我调用 listDATA.RemoveAt(); 时,GUI 会自动更新;列表数据。添加(); listDATA.Clear();
    • 如果此集合绑定到您的 GUI,那么您不必担心更新 GUI。列表中的任何修改都会自动更新您的 GUI。你试过了吗?
    猜你喜欢
    • 2016-08-07
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多