gpt4 book ai didi

wpf - Combobox.ItemsSource 上的 StaticResource 与 DynamicResource 行为

转载 作者:行者123 更新时间:2023-12-04 06:57:32 25 4
gpt4 key购买 nike

当 ComboBox 退出可视化树时,我注意到 ComboBox.ItemsSource 上的静态资源和动态资源之间的行为差​​异。

  • 在静态示例中,选定的目的地仍然是
  • 在动态示例中,底层对象得到一个空值

  • 绑定(bind)似乎没问题,因为当组合框获得焦点并更改其 SelectedIndex 时,更改会正确通知另一个列表 - 两个对象都实现 INotifyProperty - 并且两个 List 都是 ObservableCollections。

    当动态绑定(bind)的组合框失去焦点时,奇怪的事情就会发生

    XAML
    <Window ... xmlns:me = "clr-namespace:WpfComboBoxBug">
    <Window.Resources>
    <me:ShippingList x:Key="sl" />
    <me:DestinationList x:Key="dl" />
    </Window.Resources>
    <Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
    <RowDefinition Height="21" />
    <RowDefinition Height="421*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Custom:DataGrid Grid.Row="1"
    ItemsSource="{StaticResource sl}" x:Name="dg" AutoGenerateColumns="False" Grid.RowSpan="2">
    <Custom:DataGrid.Columns>
    <Custom:DataGridTextColumn Header="Reference" Binding="{Binding Reference}" />
    <Custom:DataGridTemplateColumn Header="Destination">
    <Custom:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <TextBlock Text="{Binding Destination.Name}"></TextBlock>
    </DataTemplate>
    </Custom:DataGridTemplateColumn.CellTemplate>
    <Custom:DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
    <ComboBox ItemsSource="{StaticResource dl}" SelectedItem="{Binding Destination,Mode=TwoWay}" DisplayMemberPath="Name"/>
    </DataTemplate>
    </Custom:DataGridTemplateColumn.CellEditingTemplate>
    </Custom:DataGridTemplateColumn>
    </Custom:DataGrid.Columns>
    </Custom:DataGrid>
    <Custom:DataGrid Grid.Column="1" Grid.Row="1" ItemsSource="{StaticResource sl}" x:Name="dg2" AutoGenerateColumns="False" Grid.RowSpan="2">
    <Custom:DataGrid.Columns>
    <Custom:DataGridTextColumn Header="Reference" Binding="{Binding Reference}" />
    <Custom:DataGridTemplateColumn Header="Destination">
    <Custom:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <TextBlock Text="{Binding Destination.Name}"></TextBlock>
    </DataTemplate>
    </Custom:DataGridTemplateColumn.CellTemplate>
    <Custom:DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
    <ComboBox ItemsSource="{DynamicResource dynamicdl}" SelectedItem="{Binding Destination,Mode=TwoWay}" DisplayMemberPath="Name"/>
    </DataTemplate>
    </Custom:DataGridTemplateColumn.CellEditingTemplate>
    </Custom:DataGridTemplateColumn>
    </Custom:DataGrid.Columns>
    </Custom:DataGrid>
    <TextBox Height="23" Name="textBox1" VerticalAlignment="Top" Text="Static" />
    <TextBox Height="23" Name="textBox2" VerticalAlignment="Top" Text="Dynamic" Grid.Column="2" />
    </Grid>
    </Window>

    客服
    using System;
    /* snip */

    namespace WpfComboBoxBug
    {
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
    public MainWindow()
    {
    ShippingList sl;
    this.InitializeComponent();
    sl = this.Resources["sl"] as ShippingList;

    ResourceDictionary rd = new ResourceDictionary();
    rd.Add("dynamicdl", this.FindResource("dl"));

    dg2.Resources = rd;


    dg.ItemsSource = CollectionViewSource.GetDefaultView(sl);
    dg2.ItemsSource = CollectionViewSource.GetDefaultView(sl);
    }
    }
    }

    完整源代码位于: http://dl.free.fr/eI1VtkaB8 (与 2008 SP1、.NET 3.5 SP1 相比)

    在这种情况下,我希望动态资源的行为类似于静态资源,因为我在一开始就初始化了它一次。
  • 我在这里发现了一个错误吗?
  • 如果不是这样,您将如何解释差异?
  • 最佳答案

    我必须查看您的代码才能确定,但​​我猜您的 ComboBox 的 SelectedItem 或 SelectedValue 双向绑定(bind)到一个属性。

    当您使用 StaticResource 时,资源引用会在 XAML 加载时解析。当您使用 DynamicResource 时,资源引用将在稍后解决。因此,可能发生的情况是您的 ComboBox 启动时没有任何项目,这迫使其 SelectedItem 和 SelectedValue 为空。双向绑定(bind)会导致属性使用该值进行更新。

    我个人认为 ComboBox 无法优雅地处理这种情况是 ComboBox 设计中的错误,而不是实现错误。

    对于我自己的项目,我经常使用我创建的 ComboBox 和 ListBox 增强来解决这个问题:我有其他属性可以用来代替 SelectedValue 和 SelectedItems。我的新属性在设置 ItemsSource 之前接受任何值,之后它与 SelectedValue 或 SelectedItem 保持同步。

    您可以使用类似的技术,或者始终确保 ItemsSource 在 SelectedValue 或 SelectedItem 之前绑定(bind)/初始化。

    更新

    当控件从可视化树中移除时,一切都相反:ItemsSource 由于祖先变化而立即被清除,然后 DataContext 被清除。在此期间,ComboBox 有一个 null SelectedItem,它传播到绑定(bind)属性。

    具有附加 SelectedItem 和 SelectedValue 属性的增强型 ComboBox 或 ListBox 类也可以解决此问题:只要 ItemsSource 为非 null,它应使 SelectedItem/SelecteValue 与自定义属性保持同步,并在 ItemsSource 为 null 时将它们解耦。

    关于wpf - Combobox.ItemsSource 上的 StaticResource 与 DynamicResource 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2370696/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com