属性更改时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新手,所以我有点迷路了。
编辑
- 类
TreeViewModel
实现INotifyPropertyChanged
-
Conditions
通过从TreeView
获取IsChecked
值来更新。 - 状态列表的大小永远不会改变。当一个TreeViewItem被选中/取消选中时,TreeViewModel会发生变化。
- TreeViewModel源(本页的FooViewModel)
- 以上绑定代码。
不需要更改
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>
我假设您希望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
程序集中。