5

私は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 時間かかりました。何かアイデアがあれば試してみたいと思います。

ありがとう

4

3 に答える 3

1

変更する可能性があります

SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}" 

SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}" 
于 2009-02-16T03:43:39.270 に答える
0

これをデバッグする正しい方法は、作業中のプロジェクトを取得し、壊れたプロジェクトと同じになるか、壊れるまで交互に (壊れたコードに一致するように変更する/動作することを確認する) ことです。それが壊れるポイントは、問題がどこにあるかを示します。壊れたプロジェクトを変更することは、通常、失われた原因です。

2 つ目のポイントとして、System.Diagnostics 名前空間を XAML に追加することをお勧めします。Visual Studio の [出力] ウィンドウにエラーが表示されます。

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase"

おそらく関連する点として (壊れたプロジェクトの問題が実際には明確ではないという点で)、次のことに関連するこの StackOverflow の質問(「Tabcontrol を制御するコンボボックス」) を見ているかもしれません。

  • WPF、
  • コンボボックス、
  • TabControls、および
  • SelectedIndex を使用してそれらの間をバインドします。

この質問に対する解決策はまだありませんが、より単純な問題です。

最後に、Josh Smith の MSDN コードはかなり大きいです。すべてのコードを見ないと、ComboBox を追加するために何を変更したかを理解するのは困難です。

于 2009-02-16T18:07:47.760 に答える
0

回答の投稿が遅れて申し訳ありません。Open ID を起動して実行する際に、何らかの問題がありました。

これは非常に奇妙な問題です。

この問題の解決策は、ウィンドウからはまったく得られませんでした。ウィンドウの show メソッドが呼び出される前に、別のウィンドウがダイアログとして開かれていました。このダイアログには、次のリソースがありました

<Window.Resources>
    <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/>
</Window.Resources>

「DynamicResource」と同じウィンドウ内の 2 つのテキストブロックによって参照されていました。ダイアログをオフにして、問題のあるウィンドウでアプリケーションを起動した後、問題はダイアログ ウィンドウが原因であることが判明しました。この問題を調査しているときに、動的にする理由がなかったので、同僚が DynamicResource を StaticResource に変えることを提案しました。

ダイアログ ウィンドウのスコープ内でのみ使用可能なリソースを使用するダイアログ ウィンドウでのこの変更により、上記の「メイン ウィンドウ」で説明したバインディングの問題が修正されました。もっと奇妙なことが起こると思います。

于 2009-02-17T16:07:40.643 に答える