2017-04-26 10 views
0

特定の条件に基づいてポップアップ内のボタンの色を変更したいので、その条件に基づいてテキストを設定したいと思います。私はコードの背後でこれを行う必要があります。WPFポップアップの要素にアクセスするにはどうすればよいですか?

StackPanelに複数のTextBlockがあるポップアップがあります。最初の3つのコースの詳細にバインドされています(これはスケジューリングアプリ、学校のプロジェクトです)。最後の1つは、そのコースに関する競合がない限り空になりたい。つまり、ポップアップを開くたびにTextBlockに何が入っているのかを動的に決定したいのです。

<Popup Name="CourseListDetail" Width="Auto" Height="Auto"> 
      <StackPanel> 
       <TextBlock Margin="10,10,10,0"> 
        <TextBlock.Text> 
         <MultiBinding StringFormat="{}{0}: {1}"> 
          <Binding Path="CourseCode"/> 
          <Binding Path="LongTitle"/> 
         </MultiBinding> 
        </TextBlock.Text> 
       </TextBlock> 
       <TextBlock Margin="10,0,10,0"> 
        <TextBlock.Text> 
         <MultiBinding StringFormat="{}{0} - {1}/{2}"> 
          <Binding Path="ProfessorsString"/> 
          <Binding Path="Enrollment"/> 
          <Binding Path="Capacity"/> 
         </MultiBinding> 
        </TextBlock.Text> 
       </TextBlock> 
       <TextBlock Margin="10,0,10,0" Grid.Row="2" Grid.Column="1" Text="{Binding MeetingsString}" TextWrapping="Wrap" 
          HorizontalAlignment="Center"/> 
       <TextBlock TextWrapping="WrapWithOverflow" MaxWidth="300" Text="{Binding Description}" Margin="10,10,10,10"/> 
       <TextBlock Name="ConflictText" Foreground="Red" HorizontalAlignment="Center" Text="{Binding ConflictString}"/> 
       <Button Name="Detail_AddCourse" Content="Add To Schedule" Margin="10,10,10,10" Padding="5" Background="LightGreen" 
         Click="AddCourseButton_Click" 
         Style="{StaticResource MyButtonStyle}"/> 
      </StackPanel> 
     </Border> 
    </Popup> 

私はあなたがコース上でクリックしたときにポップアップを開き、そのコースについてポップアップのDataContextを与える機能を持っていますが、私はその直下のTextBlock、またはボタンにアクセスする方法がわかりません、機能を通じて。私は子供のプロパティか何かがあるはずと考えたので、私はボタンを呼ぶことができ、のようなもの:

CourseListDetail.Detail_AddCourse.Background = "Red"; 

または

CourseListDetail.Child.Button().Background = "Red"; 

などの機能の背後にある

コード:

private void CourseListItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     ListViewItem selection = sender as ListViewItem; 
     Course course = selection.DataContext as Course; 

     CourseListDetail.DataContext = course; 
     CourseListDetail.PlacementTarget = selection; 
     CourseListDetail.IsOpen = true; 
     CourseListDetail.Focus(); 

     hasConflict conflictType = _schedule.HasConflict(course); 
     if (conflictType != hasConflict.NO_CONFLICT) {  //If there is a conflict 
      //Change button color to red here 

      if (conflictType == hasConflict.COURSE_FULL) { //If the course is full 
       //Set TextBlock text to conflict message here 
      } 
     } 
     else { //No conflict 
      //Set button color to green 
     } 
    } 

hasflictは単なる列挙型です

+1

なぜいくつかのプロパティを使用して、それらを色などにバインドしないでください。 – Krishna

+0

これに対する正しい答えは、いつものように、ポップアップ要素を直接操作してはならない**ことです。あなたのポップアップは、適切にポップアッププロパティにバインドされた、制御したいプロパティを含むビューモデルによってコードの背後に表示されるべきです。次に、ビューモデルのプロパティを変更するだけで、ポップアップ自体に自動的に反映されます。 –

+0

これは初めてWPFを使用しています。私はこのプロジェクトのためにそれを学び始めたばかりで、私たちはSprint 2にいます。あなたのどちらが示唆していることをやっているか、あるいはあなたが正確に提案していることをどうやって行うのかは本当に分かりません。 –

答えて

0

名前の代わりにx:名前を使用します。それで、コードの中の要素にアクセスすることができます。説明はIn WPF, what are the differences between the x:Name and Name attributes?を参照してください。

+0

あなたが参照している質問への答えが説明するように、 'Name'属性は' x:Name'にマップされ、適切な場合はフィールドを生成します(例えば、要素がテンプレート内にない場合その場合の要素の実際の単一インスタンス)。あなたの答えは実際にOPのコードをどのように修正するのですか?あなたはそれを試しましたか?質問に答えることを確認しましたか? –

+0

コードのポップアップのボタンにアクセスできるようにして、OPコードを修正します。確かに私はそれをテストしました。確かに私はそれを確認しました。テンプレートに関するOPの質問には何もありません。私が解釈したポップアップは、ウィンドウで定義されています。リスト項目ごとに別々のポップアップを持つ必要はありません。 – AQuirky

+0

私はOPのコードのコンテキストで提案をテストできたことに驚いています。彼らはテストするために実際の[mcve]を提供しなかったので。この文脈では、 'Name'と' x:Name'の両方がコードビハインドでフィールドを生成し、前者の代わりに後者を使用する提案がどのように問題に対処するのか、まだ分かりません。 –

関連する問題