Solved

WPF - Bind button text to property

Posted on 2011-02-24
7
1,724 Views
Last Modified: 2012-05-11
Hi,

i have datagrid with buttons (for cancel, update etc.) on each row and a button template corresponding to each button. The grid is bound to an observable collection containing order objects. The pause buttons content (text) is bound to a string propery in the order object and the content is supposed to change when the propery change.

How do i properly bind the content on the button to the string property?

button template:

            <Style x:Key="PauseButtonTemplate" TargetType="{x:Type igDP:CellValuePresenter}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}">
                            <Button Name="PauseButton" Content="{Binding AlgoStatusButtonText, Mode=TwoWay}" Command="{Binding Path=DataContext.AlgoStatusButtonCommand, ElementName=xamDPTimeJeeves}"
                                    CommandParameter="{Binding}" Width="80" Height="20"></Button>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Datagrid:

        <igDP:XamDataPresenter
                x:Name="xamDPTimeJeeves"  
               Theme="Royale" DataSource="{Binding TimeOrders}" MaxHeight="400" Width="874">

            <igDP:XamDataPresenter.FieldLayouts>
                <igDP:FieldLayout Key="ParentLayout">
                    <igDP:FieldLayout.Fields>
                        <igDP:UnboundField Name="PauseOrder" Label="Pause Order" Column="0">
                            <igDP:UnboundField.Settings>
                                <igDP:FieldSettings CellValuePresenterStyle="{StaticResource PauseButtonTemplate}" CellHeight="12" CellWidth="50">
                                </igDP:FieldSettings>
                            </igDP:UnboundField.Settings>
                        </igDP:UnboundField>


Corresponding viewmodel:

        void AlgoStatusButtonCommandExecute(DataRecord dataRecord)
        {
            if ((EAlgoStatusButtonText)dataRecord.Cells["AlgoStatusButtonText"].Value == EAlgoStatusButtonText.Stop)
            {
                _algoConnection.Stop(Convert.ToInt32(dataRecord.Cells["InternalId"].Value));
                var order = (from o in TimeOrders where o.InternalId == Convert.ToInt32(dataRecord.Cells["InternalId"].Value) select o).ToList()[0];
                TimeOrders[TimeOrders.IndexOf(order)].AlgoStatusButtonText = EAlgoStatusButtonText.Restart;
                base.OnPropertyChanged("TimeOrders");
            }



Regards
//Robert

0
Comment
Question by:lynxSE
  • 4
  • 2
7 Comments
 
LVL 19

Expert Comment

by:Manoj Patil
ID: 34969661
0
 
LVL 22

Expert Comment

by:Snarf0001
ID: 34970208
I'm assuming you don't need a basic tutorial, since you already have it bound, its just not updating.

Can you post some of the code for the TimeOrders?  I'm assuming this is a collection of TimeOrder objects?
The AlgoStatusButtonText  property in particular, does the class implement INotifyPropertyChanged, and if so, does the AlgoStatusButtonText  property send out the proper notification?
Most of the time, when bindings aren't updating properly, it's because the bound target isn't actually receiving any notification that the source property has updated.
0
 

Author Comment

by:lynxSE
ID: 34970437
I have a object named clientorder with a property called AlgoStatusButtonText:

   public class ClientOrder : IOrder
    {
        public ClientOrder()
        {
        }
         
         public EAlgoStatusButtonText AlgoStatusButtonText{get; set; }
         }

That object is "wrapped" in a viewmodel called ClientOrderViewModel which implements ViewModelBase which in turn implements INotifyPropertyChanged.

    public class ClientOrderViewModel : ViewModelBase
    {
        private ClientOrder _clientOrder;

        public ClientOrderViewModel()
        {
            _clientOrder = new ClientOrder();
            AlgoStatusButtonText = EAlgoStatusButtonText.Stop;
        }

        public EAlgoStatusButtonText AlgoStatusButtonText
        {
            get { return _clientOrder.AlgoStatusButtonText; }
            set
            {
                _clientOrder.AlgoStatusButtonText = value;
                OnPropertyChanged("AlgoStatusButtonText");
            }
           
        }
       
It works if i put a propery in the viewmodel containing the ObservableCollection but not if i put the property in the ClientOrderObject.

Sorry if it seems messy, not sure if i implemented the MVVM pattern correctly.

TimeJeevesView -> TimeJeevesViewModel (with observable collection) -> ClientOrderViewModel (that wraps the object, with OnProperyChanged Method ) -> ClientOrderModel (object)

Regards
Robert
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 22

Expert Comment

by:Snarf0001
ID: 34970680
Odd, don't really see anything that should be messing that up...

Can you try putting a breakpoint in the AlgoStatusButtonText property in the viewmodel, and verify that it is actually being hit?

A couple other things... though I don't know where all you're using it, I'd suspect you don't really need a two-way binding on the Button's content property.  TwoWays are typically used for input control to push changed values back to the source.  It's not expected that you'd be changing the buttons text manually.

I personally am not a big fan of Infragistics and telerik and the control companies.  Though taking nothing away from them (beautiful controls that ease a lot of dev work), a gigantic portion of the postings I see here and on other sites end up being due to unforseen glitches in their controls.  A little suspicious that it's something like that.
0
 

Author Comment

by:lynxSE
ID: 34978579
Ok, i will try to contact Infragistics to see if they have any pointers.

I will leave this question open in the mean time.

You are absolutely right about the two-way binding.

Thank you for your help so far.

Regards
Robert
0
 

Accepted Solution

by:
lynxSE earned 0 total points
ID: 35350584
The solution was:
            <Style x:Key="PauseButtonTemplate" TargetType="{x:Type igDP:CellValuePresenter}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}">
                            <Button Name="PauseButton" Content="{TemplateBinding Value}" Command="{Binding Path=DataContext.AlgoStatusButtonCommand, ElementName=xamDPTimeJeeves}"
                                    CommandParameter="{Binding}" Width="80" Height="20"></Button>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Datagrid:

        <igDP:XamDataPresenter
                x:Name="xamDPTimeJeeves"  
               Theme="Royale" DataSource="{Binding TimeOrders}" MaxHeight="400" Width="874">

            <igDP:XamDataPresenter.FieldLayouts>
                <igDP:FieldLayout Key="ParentLayout">
                    <igDP:FieldLayout.Fields>
                        <igDP:UnboundField Name="PauseOrder" BindingPath="AlgoStatusButtonText"  Label="Pause Order" Column="0">
                            <igDP:UnboundField.Settings>
                                <igDP:FieldSettings CellValuePresenterStyle="{StaticResource PauseButtonTemplate}" CellHeight="12" CellWidth="50">
                                </igDP:FieldSettings>
                            </igDP:UnboundField.Settings>
                        </igDP:UnboundField>

0
 

Author Closing Comment

by:lynxSE
ID: 35381803
Infragistics support team provided me with this solution.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

IP addresses can be stored in a database in any of several ways.  These ways may vary based on the volume of the data.  I was dealing with quite a large amount of data for user authentication purpose, and needed a way to minimize the storage.   …
Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
This is used to tweak the memory usage for your computer, it is used for servers more so than workstations but just be careful editing registry settings as it may cause irreversible results. I hold no responsibility for anything you do to the regist…

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now