属性更改时的WPF调用方法

时间:2013-04-11 14:18:01

标签: c# wpf properties

在C#中,如何在属性更改时调用方法(方法和属性都属于同一个类)?

如,

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 */
    }
}

结合

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

用例(如果您很好奇)

属性Status绑定到xaml中的TreeView控件。更新后,我想调用一个更新属性Conditions的方法。此属性绑定到xaml中的TextBox

我是C#中的Eventing的新手,所以有点迷失。

修改

  1. class TreeViewModel实现了INotifyPropertyChanged
  2. 通过Conditions获取IsChecked值来更新
  3. TreeView
  4. 状态列表的大小永远不会改变。选择/取消选择TreeViewItem时,TreeViewModel会更改。
  5. TreeViewModel源(this页面上的FooViewModel)
  6. 上面的绑定代码。
  7. 无需更改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>
    

1 个答案:

答案 0 :(得分:8)

我假设您希望在列表中添加/删除/更改updateConditions时触发item,而不是列表引用本身发生更改。

由于您在TreeViewModel中实现了INotifyPropertyChanged,我认为您希望使用ObservableCollection<T>而不是普通的List<T>。请在此处查看:http://msdn.microsoft.com/en-us/library/ms668604.aspx

  

表示动态数据集合,在添加,删除项目或刷新整个列表时提供通知。

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。据我所知,当引用更改或其任何属性发生更改时(通过INotifyPropertyChanged通知),它会认为它已“更改”

在这里查看:http://msdn.microsoft.com/en-us/library/ms653375.aspx

  

ObservableCollection.CollectionChanged事件   添加,删除,更改,移动项目或刷新整个列表时发生。

ObservableCollection<T>位于System.Collections.ObjectModel程序集中的System.dll命名空间中。