English 中文(简体)
英联邦秘书处
原标题:StaticResource vs DynamicResource behaviour on Combobox.ItemsSource

我注意到ComboBox的静态资源和动态资源之间的行为差异。 项目Source,当ComboBox从视觉树中抽出时。

  • in the static exemple the selected destination remains
  • in the dynamic exemple, the underlying object gets a null value

装饰似乎为科索沃,因为当 com子集中使用并改变其选择的Index时,该改动被适当通知到另一个清单——两个物体都实施认证程序,两个清单都是可观察的。

当充满活力的 com子摆脱了重点时,奇怪的事情就会发生。

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

<<>CS>。

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“rel=“nofollow noreferer” http://dl.free.fr/eI1VtkaB8 (VS 2008 SP1, NET SP 3.51 )

我期望这一动态资源与这一情况下的静态资源一样,在一开始就将它彻底化了。

  • Have I found a bug here ?
  • If that not the case, how would you explain the difference ?
最佳回答

我不得不看一下你的法典,但我想,您的ComboBox有其选择的电离层或选择的双向对财产有约束。

当你使用StaticResource时,资源参考在XAML负荷时间解决。 当你使用动态资源时,资源违约问题后来得到解决。 因此,可能发生的情况是,您的ComboBox没有开始生产任何物品,这迫使其选用Item和LentValue是无效的。 双向约束使得财产能够以这种价值更新。

我个人认为,ComboBox不能宽恕地处理这种情况,是ComboBox设计的ug,而不是执行 b。

对于我自己的项目,我经常使用一个ComboBox和PeopleBox的I创建来解决这个问题: 我拥有更多的特性,可以代替选定的Value和选定的Item。 在项目设计之前,我的新财产接受任何价值,之后与选定的Value或选定Item保持同步。

您可以采用类似技术,或总是确保项目Source在选定Value或选定项目之前受到约束/初步化。

<>Update>

当控制从视力树中除去时,一切都发生逆转: 由于祖传的改变,立即清理了物品,然后清理了数据内容。 在这段时间里,ComboBox有一个被传播给受约束财产的独占物。

强化的ComboBox或P ListBox类,加上另外的选定Item和选定的Value适当特性,也可解决这一问题: 只要物品是非核物品,只要项目物品是无损的,就应保留其与习俗特性的结合。

问题回答

暂无回答




相关问题
WPF Datagrid, Setting the background of combox popup

I would like to change the color of the popup background when using a DatagridComboboxColumn in the WPF Toolkit datagrid. I ve edited the Template for a normal Combobox and it works great for selected ...

How to insert ComboBox item into ListBox? [winforms]

The question is very simple, How to insert ComboBox selected item into ListBox using c#? I have tried with this: listbox.Items.Add(combobox.SelectedItem); and some other permutations but it always ...

How do I bind a ComboBox to a one column list

I ve seen how to bind a ComboBox to a list that has columns like this: ItemsSource="{Binding Path=Entries}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectedValue="{Binding Path=Entry}" But ...

Wpf Combobox Limit to List

We are using Wpf Combobox to allow the user to do the following things: 1) select items by typing in the first few characters 2) auto complete the entry by filtering the list 3) suggesting the first ...

热门标签