2017-04-26 79 views
0

我想根據某些條件改變彈出按鈕的顏色,我想根據這些條件設置一些文本。我需要在後面的代碼中執行此操作。如何訪問WPF彈出窗口中的元素?

我有一個StackPanel中的幾個TextBlocks彈出。前3個必然會提供有關課程的詳細信息(這是一個調度應用程序;學校項目)。最後一個我想成爲空的,除非這個過程有衝突。也就是說,我想在每次打開彈出窗口時動態決定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 
     } 
    } 

hasConflict只是一個枚舉

+1

爲什麼你不使用一些屬性並將它們綁定到顏色或其他東西? – Krishna

+0

正確的答案是,一如既往,你應該不**直接操縱彈出元素。您的彈出窗口應該在代碼後面由視圖模型表示,其中包含要控制的屬性,並根據需要綁定到彈出式屬性。然後,您只需更改視圖模型中的屬性,並自動將其反映到彈出窗口中。 –

+0

這是我第一次使用WPF。我只是開始爲這個項目學習它,我們正在Sprint 2.我真的不確定如何去做你們中的任何一個人建議,或者甚至你準確的建議。 –

回答

0

使用x:Name代替Name。然後,您將能夠訪問後面代碼中的元素。有關說明,請參閱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'將在代碼隱藏中產生一個字段,您的提議如何使用後者而不是前者來解決問題。 –