如何从WPF后面的代码访问XAML按钮

时间:2016-09-30 14:06:17

标签: wpf button datagrid window dockpanel

我的代码:

<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"时,你可以看到伙伴们,我将按钮文字更改为&#34;正在订购。&#34;并且我将数据库IsInProgres中的字段更新为1 - true,代码在此处:

 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秒刷新一次我的网格,我的按钮内容再次变得像默认状态一样#34;接受它!&#34;因为那是用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并检查NumberOfOrder是否有IsInProgress = 1并简单地设置:

btnTakeIt.Content="Order in progress.." 

所以每次我的网格刷新我都可以循环我的订单,并检查订单InProgress然后我可以将按钮btnTakeIt内容设置为&#34;订单正在进行中。&#34;

或者如果有其他方式,我会打开试试!

P.S我已经尝试了但是我的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语句内部,当我看断点时,它确实改变了内容,但在网格上我看不到任何改变:(

编辑:

enter image description here

我必须提到我的类Product包含在我的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 个答案:

答案 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));
        }
    }
}