【问题标题】:Binding in ItemTemplate on KeyValuePair not working在 KeyValuePair 上的 ItemTemplate 中的绑定不起作用
【发布时间】:2012-03-21 12:38:58
【问题描述】:

在 ListView 的 ItemTemplate 中获取绑定时遇到问题。我的绑定目标是 KeyValuePair。以下代码:

XAML:

<ListView x:Name="listViewDataItems" CanDragItems="True" DragItemsStarting="event" SelectionMode="Multiple">
  <ListView.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Path=Key}"/>
        <TextBlock Text=":"/>
        <TextBlock Text="{Binding Path=Value}"/>
      </StackPanel>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

C#:

protected override void OnNavigatedTo(NavigationEventArgs e) {
  if (e.Parameter != null) {
    IDataSourceExtension extension = (IDataSourceExtension)e.Parameter;
    pageTitle.Text = extension.Name;
    // Type of LastData: List<KeyValuePair<string,object>>
    listViewDataItems.ItemsSource = extension.LastData;                
  }
}

ItemsSource 设置良好并包含 KeyValuePairs,但在 ListView 中显示键和值不起作用。我在 Metro 风格应用程序中使用 .Net4.5 Beta。

【问题讨论】:

    标签: c# binding microsoft-metro .net-4.5


    【解决方案1】:

    我对此进行了测试:

    public ObservableCollection<KeyValuePair<string, object>> LvItems { get; set; }
    
    public MainWindow()
    {
       InitializeComponent();
       this.DataContext = this;
       LvItems = new ObservableCollection<KeyValuePair<string, object>>();
       LvItems.Add(new KeyValuePair<string, object>("Idx", 5));
       LvItems.Add(new KeyValuePair<string, object>("Ido", 12));
    }
    

    并使用了您的项目模板,它就像一个魅力。

    所以我最好的猜测是:

    1) 您需要使用 ObservableCollection 来通知集合中的更改(否则项目可能在此处但 ListView 不会刷新,因为它不知道集合已更改)。

    2)您应该避免直接设置集合:将其设为只读并逐个添加项目,而不是设置集合。 (或在集合的 setter 中引发 PropertyChanged)。

    编辑:完整代码。

    <Window x:Class="ConverterCombinerTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:ConverterCombinerTest"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
             <ListView ItemsSource="{Binding LvItems}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=Key}"/>
                            <TextBlock Text=":"/>
                            <TextBlock Text="{Binding Path=Value}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </Window>
    
    public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;
                LvItems = new ObservableCollection<KeyValuePair<string, object>>();
                LvItems.Add(new KeyValuePair<string, object>("Idx", 5));
                LvItems.Add(new KeyValuePair<string, object>("Ido", 12));
            }
    
            public ObservableCollection<KeyValuePair<string, object>> LvItems { get; set; }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void RaisePropertyChanged(String _Prop)
            {
                PropertyChangedEventHandler handler = this.PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(_Prop));
                }
            }
        }
    

    【讨论】:

    • 我都试过了,但都没有成功。 List 的 Setter 已经调用了 PropertyChanged(),ObservableCollection 没有帮助。一项一项地设置项目也无济于事。我修改了我的代码并编辑了你的集合 LvItems 而不是 LastData,它也没有显示。
    • 您是否正确设置了DataContext?我发布的示例以及您的确切 XAML 可以在我的计算机上运行。
    • 我想是的,我添加到我的 xaml ListView 代码 ItemsSoruce={Binding} 并在 c# listViewData.DataContext = extension.LastData; 中设置。仍然显示正确数量的项目,但仅显示“:”而不是“键:值”。你用 .net4.5 beta 测试过吗?
    • 设置整个 Windows/UserControl 的 DataContext,而不是每个特定元素的 DataContext。我添加了我的整个代码。
    • 不起作用:/我创建了一个新的干净的 Metro 风格项目,添加了您的代码,添加了我的模板,但不起作用。您是否在 Metro 风格应用中尝试过?
    猜你喜欢
    • 2011-07-19
    • 2023-03-17
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多