2016-09-30 82 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通知。现在检查 –

相关问题