■45122 / inTopicNo.1) |
TabControlのコンテンツにRunを配置したい |
□投稿者/ ryo (1回)-(2009/12/31(Thu) 05:17:55)
|
分類:[.NET 全般]
はじめまして。
Visual C# 2008 Express Editionで開発をしております。
データ配列をバインドしたTabControlの中にRunを配置し、要素ごとの値をRunに表示したいと考えています。
サイトを調べたりして作ってみたのですが、フォーム表示後タブを切り替えると下記の例外が発生してしまいます。
「コレクションは変更されています。列挙操作は実行されない可能性があります。」
何か分かる方が居られましたらご教授お願い致します。
現在の実装ですが、
1.要素毎の値をRunに表示するため、Runを継承したBindableRunクラスを作りBindableTextプロパティを持たせている。
(RunのTextプロパティがDependencyPropertyではない為。)
2.BindableRunを、TabControlのContentTemplateへ配置している。
以下は原因調査用に簡略化したソースで、適当に作ったListBoxをバインディングのソースにしています。
宜しくお願いいたします。
[Window1.xaml]
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<DockPanel>
<ListBox Height="100" Name="listBox1" DockPanel.Dock="Top" />
<TabControl Name="tabControl1" ItemsSource="{Binding ElementName=listBox1, Path=Items}">
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Inlines>
<local:BindableRun BindableText="{Binding}" />
</TextBlock.Inlines>
</TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</DockPanel>
</Window>
[Window1.xaml.cs]
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
listBox1.ItemsSource = new string[] { "ABC", "123", "あいう" };
}
}
[BindableRun.cs]
public class BindableRun : Run
{
public string BindableText
{
get { return (string)GetValue(BindableTextProperty); }
set { SetValue(BindableTextProperty, value); }
}
public static readonly DependencyProperty BindableTextProperty =
DependencyProperty.Register("BindableText",
typeof(string),
typeof(BindableRun),
new UIPropertyMetadata(String.Empty, BindableTextChanged));
private static void BindableTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
Run run = (Run)sender;
run.Text = (string)e.NewValue;
}
}
|
|