Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF call method when property changes

Tags:

c#

properties

wpf

In C#, how can a method be called when a property changes (both method and property belong to the same class)?

e.g.,

class BrowserViewModel
{
    #region Properties

    public List<TreeViewModel> Status { get; private set; }
    public string Conditions { get; private set; }

    #endregion // Properties

    // i'd like to call this method when Status gets updated
    void updateConditions
    {
         /* Conditions = something depending on the TreeViewItem select status */
    }
}

Binding

<TreeView Grid.Row="1"
    x:Name="StatusTree"
    ItemContainerStyle="{StaticResource TreeViewItemStyle}"
    ItemsSource="{Binding Path=Status, Mode=OneTime}"
    ItemTemplate="{StaticResource CheckBoxItemTemplate}"
/>

Use-Case (if you are curious)

The property Status is bound to a TreeView control in the xaml. When it is updated, I'd like to call a method that updates the property Conditions. This property is bound to a TextBox in the xaml.

I'm new to Eventing in C#, so am a little lost.

Edit

  1. class TreeViewModel implements INotifyPropertyChanged.
  2. Conditions is updated by getting the IsChecked Value from the TreeView.
  3. The size of the Status List never changes. When a TreeViewItem is selected/unselected the TreeViewModel changes.
  4. TreeViewModel source (FooViewModel on this page)
  5. Binding code above.
  6. Didn't have to change Binding Mode for IsChecked.

        <HierarchicalDataTemplate 
            x:Key="CheckBoxItemTemplate"
            ItemsSource="{Binding Children, Mode=OneTime}"
            >
                <StackPanel Orientation="Horizontal">
                <!-- These elements are bound to a TreeViewModel object. -->
                <CheckBox
                    Focusable="False" 
                    IsChecked="{Binding IsChecked}" 
                    VerticalAlignment="Center"
                    />
                <ContentPresenter 
                    Content="{Binding Name, Mode=OneTime}" 
                    Margin="2,0"
                    />
                </StackPanel>
        </HierarchicalDataTemplate>
    
like image 739
mauryat Avatar asked Apr 11 '26 07:04

mauryat


1 Answers

I assume you want updateConditions to fire whenever an item is added/removed/changed in your list, not if the list reference itself changes.

Since you're implementing INotifyPropertyChanged within your TreeViewModel, I think you'll want to use ObservableCollection<T> instead of a plain List<T>. Check it here: http://msdn.microsoft.com/en-us/library/ms668604.aspx

Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.

class BrowserViewModel
{
    #region Properties

    public ObservableCollection<TreeViewModel> Status { get; private set; }
    public string Conditions { get; private set; }

    #endregion // Properties

    // i'd like to call this method when Status gets updated
    void updateConditions
    {
         /* Conditions = something */
    }

    public BrowserViewModel()
    {
        Status = new ObservableCollection<TreeViewModel>();
        Status.CollectionChanged += (e, v) => updateConditions();
    }
}

CollectionChanged will fire whenever an item is added/removed/changed. As far as I know, it will consider it "changed" when its reference changes or any of its properties are changed (which is notified through INotifyPropertyChanged)

Just checked it here: http://msdn.microsoft.com/en-us/library/ms653375.aspx

ObservableCollection.CollectionChanged Event Occurs when an item is added, removed, changed, moved, or the entire list is refreshed.

ObservableCollection<T> resides in the System.Collections.ObjectModel namespace, in System.dll assembly.

like image 73
Conrad Clark Avatar answered Apr 12 '26 21:04

Conrad Clark



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!