2016-09-30 90 views
1

我的代碼:如何從代碼中訪問XAML按鈕後面WPF

<DataGrid HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderBrush="#83D744" IsSynchronizedWithCurrentItem="False" VerticalGridLinesBrush="Transparent" Grid.Column="0" RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False" x:Name="datagrid1" Margin="10,150,8,50" Background="Transparent" RowBackground="#FF494949" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" ItemsSource="{Binding}"> 
    <DataGrid.Resources> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="Background" Value="#83D744"/> 
      <Setter Property="Opacity" Value="1"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="HorizontalContentAlignment" Value="Center" /> 
      <Setter Property="FontSize" Value="18"/> 
      <Setter Property="FontFamily" Value="Arial"/> 
      <Setter Property="Height" Value="50"/> 
     </Style> 


<Style x:Key="TextInCellCenter" TargetType="{x:Type TextBlock}" > 
    <Setter Property="TextAlignment" Value="Center"/> 
</Style> 
<Style TargetType="{x:Type TextBlock}" x:Key="RightAligElementStyle"> 
    <Setter Property="TextAlignment" Value="Right"/> 
</Style> 
<Style TargetType="{x:Type TextBlock}" x:Key="LeftAligElementStyle"> 
    <Setter Property="TextAlignment" Value="Left"/> 
</Style> 
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
      Color="Transparent"/> 
</DataGrid.Resources> 


<DataGrid.Columns > 
    <DataGridTextColumn Binding="{Binding ProductName}"  ElementStyle="{StaticResource LeftAligElementStyle}"  Header="NAZIV ARTIKLA" MinWidth="350" Foreground="White" FontSize="20" FontFamily="Verdana" /> 
    <DataGridTextColumn Binding="{Binding Quantity}"  ElementStyle="{StaticResource TextInCellCenter}"   Header="KOLIČINA" MinWidth="200" Foreground="White"  FontSize="20" FontFamily="Verdana" /> 
</DataGrid.Columns> 

<DataGrid.GroupStyle> 
    <!-- Style for groups at top level. --> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type GroupItem}"> 
          <Expander IsExpanded="True" Background="Black" Opacity="0.7"> 
           <Expander.Header > 
            <DockPanel Height="50" Margin="0,0,0,0" Name="dockPanel" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=ActualWidth}"> 

             <Button Name="btnFinishOrder" Content="Finish Order" Margin="0,0,55,5" DockPanel.Dock="Right" Click="btnFinishOrder_Click" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#83D744" Background="Transparent" BorderBrush="#83D744" Width="130" Height="40"> 
              <Button.Template> 
               <ControlTemplate TargetType="Button"> 
               <Border BorderThickness="{TemplateBinding BorderThickness}" 
                 BorderBrush= "{TemplateBinding BorderBrush}" 
                 Background=  "{TemplateBinding Background}"> 
                 <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
               </Border> 
               </ControlTemplate> 
              </Button.Template> 
             </Button> 

             <Button Name="btnTakeIt" Click="btnTakeIt_Click" Content="Take it" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#83D744" Background="Transparent" BorderBrush="#83D744" Width="130" Height="40"> 
              <Button.Template> 
               <ControlTemplate TargetType="Button"> 
               <Border BorderThickness="{TemplateBinding BorderThickness}" 
                 BorderBrush="{TemplateBinding BorderBrush}" 
                 Background="{TemplateBinding Background}"> 
                 <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
               </Border> 
               </ControlTemplate> 
              </Button.Template> 
             </Button> 
             <TextBlock FontWeight="Normal" FontFamily="Verdana" FontSize="20" Height="25" Foreground="#83D744" Text="{Binding Path=Name,StringFormat= Number of Order:# {0}}" /> 

            </DockPanel> 
           </Expander.Header> 
           <Expander.Content> 
            <ItemsPresenter /> 
           </Expander.Content> 
          </Expander> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
</DataGrid.GroupStyle> 

enter image description here

那裏你可以看到球員,當我點擊按鈕Click="btnTakeIt_Click"我programaticaly改變按鈕文本「訂單正在進行中」。我在我的數據庫IsInProgres 1更新場 - 真,代碼是在這裏:

private void btnTakeIt_Click(object sender, RoutedEventArgs e) 
    { 
     Button b = sender as Button; 

     CollectionViewGroup group = b.DataContext as CollectionViewGroup; 
     var x = group.Name; 
     int orderNumber = Convert.ToInt32(x); 

     b.BorderBrush = null; 
     b.Content = "Order is in progress"; 
     b.FontSize = 12; 

     OrdersController.SetOrderInProgressByID(orderNumber); 

    } 

但發生了什麼,因爲我刷新我的網格每20秒我的按鈕內容再次成爲喜歡它的缺省「拿去!」因爲這就是用XAML寫的。

像這樣: enter image description here

這是我後面的代碼(更新每隔幾秒鐘):

public MainWindow() 
{ 
    try 
    { 


     InitializeComponent(); 


     this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     this.WindowState = WindowState.Maximized; 

     var ordersList = OrdersController.localOrders(); 


     collectionViewSource.Source = ordersList; 
     collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder")); 
     DataContext = collectionViewSource; 

     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(20); 
     timer.Tick += timer_Tick; 
     timer.Start(); 

    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 

void timer_Tick(object sender, EventArgs e) 
{ 

    var ordersList = OrdersController.localOrders(); 
    collectionViewSource.Source = null; 
    collectionViewSource.Source = ordersList; 

    DataContext = collectionViewSource; 

    datagrid1.ScrollIntoView(datagrid1.Items[datagrid1.Items.Count - 1]); 
} 

}

所以我的問題是我能以某種方式循環我localOrders和檢查​​有IsInProgress = 1並且簡單地設置:

btnTakeIt.Content="Order in progress.." 

所以每次我的網格刷新我可以循環我的命令,並檢查是爲了InProgress之後,我可以設置按鈕btnTakeIt內容爲「在建訂單。」

或者,如果有任何其他的方式,我打開試試吧!

PS我想媒體鏈接,但我的btnTakeIt是無法訪問的代碼:(

編輯背後:

void timer_Tick(object sender, EventArgs e) 
    { 
     Button MyButton = FindChild<Button>(datagrid1, "btnTakeIt"); 

     var ordersList = OrdersController.localOrders(); 
     collectionViewSource.Source = null; 
     collectionViewSource.Source = ordersList; 
     foreach (var item in ordersList) 
     { 
      if (item.IsInProgress== true) 
      { 
       MyButton.Content = "Order is in progress"; 
      } 
     } 

     DataContext = collectionViewSource; 


    } 

我可以做這樣我檢查debuger,它是if語句內進入當我看着它斷點變化acctualy的內容,但對電網我什麼都看不到改變:(

編輯:

enter image description here

我不得不提到我的類產品被包含在我的OrdersController :)

@Ayuman 你覺得這個怎麼樣:

<Button Name="btnTakeIt" DataContext="{Binding Items[0]}" Content="{Binding Status}"Click="btnTakeIt_Click" Content="Take it" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#83D744" Background="Transparent" BorderBrush="#83D744" Width="130" Height="40"> 
             <Button.Template> 
              <ControlTemplate TargetType="Button"> 
              <Border BorderThickness="{TemplateBinding BorderThickness}" 
                BorderBrush="{TemplateBinding BorderBrush}" 
                Background="{TemplateBinding Background}"> 
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
              </Border> 
              </ControlTemplate> 
             </Button.Template> 
            </Button> 

後面的代碼:

public static List<LocalOrders> localOrders() 
    { 
     var results = DataServices.POS.proc_GetAllOrders().ToList(); 


     List<LocalOrders> localOrdersList = new List<LocalOrders>(); 

     foreach (var item in results) 
     { 
      LocalOrders lokal = new LocalOrders(); 
      if (item.IsInProgress) 
      { 
       localo.Pihvacena = true; 
       localo.Status = "IN PROCESS"; 
      } 
      else 
      { 
       lokalne.Status = "IT IS NOT YET IN PROCESS"; 
      } 


      lokal.User = item.User; 
      lokal.Quantity = Convert.ToInt32(item.Quantity); 
      lokal.Title = item.Title; 
      lokal.NumberOfOrder = item.NumberOfOrder; 
      localOrdersList.Add(lokal); 
     } 
     return localOrdersList; 
    } 

因此,我可以programaticaly檢查訂單的狀態,並設置按鈕的內容像是..它可能是好的解決方案嗎?

+1

你可以使用在帖子中建議的方法遍歷可視樹。 http://stackoverflow.com/questions/16997951/how-to-access-datagrid-template-column-textbox-text-wpf-c-sharp –

+0

@Ayyappan Subramanian我從你的鏈接編輯下面的帖子,你可以採取看編輯隊友,我可能犯了一些錯誤,我發現按鈕,它的內容,但我不能改變它的方式。檢查編輯夥計 –

+0

我認爲你沒有改變文本文本都說「訂單正在進行中」。 –

回答

1

請參考下面的代碼。我試圖讓它工作。希望這也適用於你

<DataGrid HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderBrush="#83D744" IsSynchronizedWithCurrentItem="False" VerticalGridLinesBrush="Transparent" Grid.Column="0" RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False" x:Name="datagrid1" Margin="10,150,8,50" Background="Transparent" RowBackground="#FF494949" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" ItemsSource="{Binding}"> 
     <DataGrid.Resources> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="Background" Value="#83D744"/> 
       <Setter Property="Opacity" Value="1"/> 
       <Setter Property="Foreground" Value="White"/> 
       <Setter Property="HorizontalContentAlignment" Value="Center" /> 
       <Setter Property="FontSize" Value="18"/> 
       <Setter Property="FontFamily" Value="Arial"/> 
       <Setter Property="Height" Value="50"/> 
      </Style> 


      <Style x:Key="TextInCellCenter" TargetType="{x:Type TextBlock}" > 
       <Setter Property="TextAlignment" Value="Center"/> 
      </Style> 
      <Style TargetType="{x:Type TextBlock}" x:Key="RightAligElementStyle"> 
       <Setter Property="TextAlignment" Value="Right"/> 
      </Style> 
      <Style TargetType="{x:Type TextBlock}" x:Key="LeftAligElementStyle"> 
       <Setter Property="TextAlignment" Value="Left"/> 
      </Style> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
     Color="Transparent"/> 
     </DataGrid.Resources> 


     <DataGrid.Columns > 
      <DataGridTextColumn Binding="{Binding ProductName}"  ElementStyle="{StaticResource LeftAligElementStyle}"  Header="NAZIV ARTIKLA" MinWidth="350" Foreground="White" FontSize="20" FontFamily="Verdana" /> 
      <DataGridTextColumn Binding="{Binding Quantity}"  ElementStyle="{StaticResource TextInCellCenter}"   Header="KOLIČINA" MinWidth="200" Foreground="White"  FontSize="20" FontFamily="Verdana" /> 
     </DataGrid.Columns> 

     <DataGrid.GroupStyle> 
      <!-- Style for groups at top level. --> 
      <GroupStyle> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <DataGridRowsPresenter/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander IsExpanded="True" Background="Black" Opacity="0.7"> 
             <Expander.Header > 
              <DockPanel Height="50" Margin="0,0,0,0" Name="dockPanel" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=ActualWidth}"> 

               <Button Name="btnFinishOrder" DataContext="{Binding Items[0]}" Content="{Binding ButtonCaption}" Margin="0,0,55,5" DockPanel.Dock="Right" Click="BtnFinishOrder_OnClick" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#83D744" Background="Transparent" BorderBrush="#83D744" Width="130" Height="40"> 
                <Button.Template> 
                 <ControlTemplate TargetType="Button"> 
                  <Border BorderThickness="{TemplateBinding BorderThickness}" 
                BorderBrush= "{TemplateBinding BorderBrush}" 
                Background=  "{TemplateBinding Background}"> 
                   <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
                  </Border> 
                 </ControlTemplate> 
                </Button.Template> 
               </Button> 

               <Button Name="btnTakeIt" Click="BtnTakeIt_OnClick" DataContext="{Binding Items[0]}" Content="{Binding ButtonCaption}" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#83D744" Background="Transparent" BorderBrush="#83D744" Width="130" Height="40"> 
                <Button.Template> 
                 <ControlTemplate TargetType="Button"> 
                  <Border BorderThickness="{TemplateBinding BorderThickness}" 
                BorderBrush="{TemplateBinding BorderBrush}" 
                Background="{TemplateBinding Background}"> 
                   <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
                  </Border> 
                 </ControlTemplate> 
                </Button.Template> 
               </Button> 
               <TextBlock FontWeight="Normal" FontFamily="Verdana" FontSize="20" Height="25" Foreground="#83D744" Text="{Binding Items[0].ProductName}" /> 

              </DockPanel> 
             </Expander.Header> 
             <Expander.Content> 
              <ItemsPresenter /> 
             </Expander.Content> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </DataGrid.GroupStyle> 
     </DataGrid> 

public partial class MainWindow : Window 
{ 
    private ICollectionView view; 
    private ObservableCollection<Product> ordersList; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     this.WindowState = WindowState.Maximized; 

     ordersList = new ObservableCollection<Product>() 
     { 
      new Product() 
      { 
       ProductName = "Prodct", 
       Quantity = 1, 
       NumberOfOrder = 100, 
       IsInProgress = true, 
       ButtonCaption = "Take it" 
      }, 
      new Product() 
      { 
       ProductName = "Prodct1", 
       Quantity = 2, 
       NumberOfOrder = 1000, 
       ButtonCaption = "Take it" 

      }, 
      new Product() 
      { 
       ProductName = "Prodct2", 
       Quantity = 3, 
       NumberOfOrder = 10000, 
       ButtonCaption = "Take it" 

      }, 
      new Product() 
      { 
       ProductName = "Prodct3", 
       Quantity = 4, 
       NumberOfOrder = 100000, 
       ButtonCaption = "Take it" 

      }, 
     }; 

     view = CollectionViewSource.GetDefaultView(ordersList); 

     view.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder")); 
     DataContext = view; 

     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(20); 
     timer.Tick += Timer_Tick; ; 
     timer.Start(); 
    } 

    private void Timer_Tick(object sender, EventArgs e) 
    { 
     foreach (var item in ordersList) 
     { 
      if (item.IsInProgress) 
      { 
       item.ButtonCaption = "Order is Still in progress"; 
      } 
     } 
    } 

    private void BtnFinishOrder_OnClick(object sender, RoutedEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    private void BtnTakeIt_OnClick(object sender, RoutedEventArgs e) 
    { 
     Button b = sender as Button; 

     Product prod = b.DataContext as Product; 

     b.BorderBrush = null; 
     prod.ButtonCaption = "Order is in progress"; 
     b.FontSize = 12; 
    } 
} 

class Product:INotifyPropertyChanged 
{ 
    private string productName; 

    public string ProductName 
    { 
     get { return productName ; } 
     set 
     { 
      productName = value ; 
      OnPropertyChanged("ProductName"); 
     } 
    } 

    private int quantity; 

    public int Quantity 
    { 
     get { return quantity; } 
     set 
     { 
      quantity = value; 
      OnPropertyChanged("Quantity"); 
     } 
    } 

    public int NumberOfOrder { get; set; } 

    public bool IsInProgress { get; set; } 

    private string buttonCaption; 

    public string ButtonCaption 
    { 
     get { return buttonCaption; } 
     set 
     { 
      buttonCaption = value; 
      OnPropertyChanged("ButtonCaption"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

伴侶我會在明天給你回覆,已經檢查過這個,明天我會執行它並且讓你回覆它的工作。 +我需要實現PropertyChangedEventHandler和OnPropertyChanged方法嗎?我需要他們全部? –

+0

修改了我的propertychanged通知。現在檢查 –

相關問題