私は2つのプロジェクトを持っています。1つは機能していて、もう1つは機能していませんが、それらの違いは重要ではないと私は考えています。最初のプロジェクトは壊れているもので、私が修正しようとしているものです。2 番目のプロジェクトは、最初のプロジェクトがまったく機能しないときに作成した小さなサンプル プロジェクトです。もちろん、サンプルは完璧に動作します。
これが最初のプロジェクトのビューです。「MainWindowTabControlStyle」の束を削除したのは、コンボ ボックスが壊れているだけだからです。この問題は、作業中のプロジェクトからコピーして貼り付けたものであるため、スタイルに問題がないことは確かです。
<Grid>
<TabControl Style="{DynamicResource MainWindowTabControlStyle}">
<TabItem Header="Tab 1"/>
<TabItem Header="Tab 2"/>
</TabControl>
</Grid>
<Style x:Key="MainWindowTabControlStyle" TargetType="{x:Type TabControl}">
...
<ComboBox
HorizontalAlignment="Right"
VerticalAlignment="Top"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Subscriptions, Mode=Default}"
SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"
ItemTemplate="{DynamicResource SubscriptionsItemTemplate}"/>
...
</Style>
<DataTemplate x:Key="SubscriptionsItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName, Mode=Default}"/>
</StackPanel>
</DataTemplate>
以下は、MainWindow の DataContext に設定されたビュー モデルです。ViewModelBase クラスは、今月の MSDN 記事で Josh Smith が書いたコードとまったく同じです。
public sealed class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
}
private ObservableCollection<Subscription> subscriptions;
public ObservableCollection<Subscription> Subscriptions
{
get
{
if (subscriptions == null)
{
subscriptions = new ObservableCollection<Subscription>();
subscriptions.Add(new Subscription() { DisplayName = "ABC" });
subscriptions.Add(new Subscription() { DisplayName = "XYZ" });
subscriptions.Add(new Subscription() { DisplayName = "PDQ" });
}
return subscriptions;
}
set { subscriptions = value; }
}
private Subscription selectedSubscription;
public Subscription SelectedSubscription
{
get { return selectedSubscription; }
set { selectedSubscription = value; }
}
}
デバッガーからプロジェクトを実行すると、最初に呼び出されるのは Subscriptions コレクションのゲッターだと思います。次に、SelectedSubscription でセッターが呼び出されます (null です)。その後、顔が青くなり、SelectedSubscription プロパティのセッターが再び変更されなくなるまで、コンボボックスで選択した項目を変更できます。コンボボックスには正しい値が含まれていることに注意してください。
2 番目のプロジェクトのコードは同じですが、最初に呼び出されるのは SelectedSubscription プロパティのセッター (null) であり、次に Subscriptions コレクションのゲッターが呼び出され、最後に SelectedSubscription のセッターが 2 回呼び出されて、 Subscriptions コレクションの最初の項目と一致する値を持っています。
この小さな宝石には約 5 時間かかりました。何かアイデアがあれば試してみたいと思います。
ありがとう