在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的新手,所以有点迷失。
TreeViewModel
实现了INotifyPropertyChanged
。Conditions
获取IsChecked
值来更新TreeView
。无需更改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>
答案 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
命名空间中。