属性更改时WPF调用方法

本文关键字:调用 方法 WPF 属性 | 更新日期: 2023-09-27 18:08:44

在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。此属性绑定到示例中的TextBox

我是c#中的event新手,所以我有点迷路了。

编辑

  1. TreeViewModel实现INotifyPropertyChanged
  2. Conditions通过从TreeView获取IsChecked值来更新。
  3. 状态列表的大小永远不会改变。当一个TreeViewItem被选中/取消选中时,TreeViewModel会发生变化。
  4. TreeViewModel源(本页的FooViewModel)
  5. 以上绑定代码。
  6. 不需要更改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>
    

属性更改时WPF调用方法

我假设您希望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程序集中。