0

いくつかのバウンド とUserControlで構成される があり、押されたボタンに基づいて、異なるデータが表示されます。のクリック イベントの1 つの例を次に示します。ItemsControlstringsButton

private void LeftPreviousScoresButton_Click(object sender, RoutedEventArgs e)
{
    if (m_previousScoresWindow.Visibility == Visibility.Visible)
    {
        m_previousScoresWindow.Hide();
    }
    else
    {
        WindowTitle = "Left Side";
        PreviousScoresA = m_previousLeftWristErosionScoresReaderA;
        PreviousScoresB = m_previousLeftWristErosionScoresReaderB;

        m_previousScoresWindow.Show();
    }
}

、 、およびを関連付けられたデータに割り当てるWindowTitle、これらのクリック イベント リスナがいくつかあります。次に、次のようにそれらにバインドします。PreviousScoresAPreviousScoresBUserControl

<ItemsControl Height="Auto" Width="Auto"
              ItemsSource="{Binding ElementName=ParentForm, Path=PreviousScoresA}" 
              Grid.Row="1" />

<ItemsControl Height="Auto" Width="Auto"
              ItemsSource="{Binding ElementName=ParentForm, Path=PreviousScoresB}" 
              Grid.Row="2" />

<TextBlock FontSize="16" FontWeight="Bold" Height="25" 
           Margin="5" HorizontalAlignment="Center" Foreground="Black" 
           Text="{Binding ElementName=ParentForm, Path=PreviousScoresWindowTitle}" />

ただし、ウィンドウを開くと、現在のデータで更新される前に、古いデータが 1 秒間表示されます。を呼び出すときにこれらの呼び出しを追加しようとHide()しましたWindowが、役に立たなかったようです:

WindowTitle = String.Empty;
PreviousScoresA = new ObservableCollection<PreviousScoreData>();
PreviousScoresB = new ObservableCollection<PreviousScoreData>();

Show()バインドされたデータが更新されるまで呼び出されないようにする方法はありますか? ありがとう。

4

1 に答える 1

0

を使用しているように見えるObservableCollectionので、コレクションを再初期化しないでください。むしろ、クリアしてから新しい値を追加する必要があります。これは、を使用するときにコレクションの同期を保つのに役立ちますObservableCollection

これは、あなたのコード サンプルに基づいたちょっとした暗示です。非表示にするときにコレクションをクリアしてから新しい値を再入力すると、目的の効果が得られるはずです。

private void LeftPreviousScoresButton_Click(object sender, RoutedEventArgs e)
{
  if (m_previousScoresWindow.Visibility == Visibility.Visible)
  {
    m_previousScoresWindow.Hide();
    WindowTitle = string.Empty;
    PreviousScoresA.Clear();
    PreviousScoresB.Clear();
  }
  else
  {
    WindowTitle = "Left Side";

    // do not re-initialize the collection; clear and add new values
    // PreviousScoresA = m_previousLeftWristErosionScoresReaderA;
    // PreviousScoresB = m_previousLeftWristErosionScoresReaderB;
    ReFillScores(PreviousScoresA, m_previousLeftWristErosionScoresReaderA);
    ReFillScores(PreviousScoresB, m_previousLeftWristErosionScoresReaderB);

    m_previousScoresWindow.Show();
  }
}

private void ReFillScores (ObservableCollection<PreviousScoreData> collection, IEnumerable<PreviousScoreData> values)
{
  collection.Clear();
  foreach(PreviousScoreData d in values)
  {
    collection.Add(d);
  }
}
于 2013-01-08T18:16:31.750 に答える