【发布时间】:2021-03-02 01:19:08
【问题描述】:
我目前有一个带有 TreeView 和其他东西的用户控件。 TreeView 的 DataContext 设置为 ViewModel 并且绑定有效:
<TreeView Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2"
ItemsSource="{Binding LoadedItem.Batches}"
Background="{Binding UiTools.ContainersBackground}">
<Interactivity:Interaction.Behaviors>
<Behaviros:BindableSelectedItemBehavior SelectedItem="{Binding SelectedSessionItem, Mode=TwoWay}"/>
</Interactivity:Interaction.Behaviors>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Groups}">
<TextBlock Text="{Binding Name, UpdateSourceTrigger=LostFocus}"/>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Samples}">
<TextBox Text="{Binding Name}"/>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate>
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
但现在我正在尝试使用 this 教程使节点可编辑。
在那里,对于 UserControl,使用了一些后面的代码,它现在实现了 INotifyPropertyChanged。事件处理程序的定义很简单:
public event PropertyChangedEventHandler PropertyChanged;
但是使用的时候总是null:
public bool IsInEditMode
{
get { return isInEditMode; }
set
{
isInEditMode = value;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(nameof(IsInEditMode)));
}
}
}
在这里,处理程序永远不会被调用,因为它总是为空。
我想这是因为我的 UserControl 的 DataContext 设置为 ViewModel 而不是 UserControl 本身。
当我将 DataContext 设置为 UserControl 时,我无法将数据绑定到 ViewModels 项。
如何解决?
【问题讨论】:
-
Handler 为空,因为您显然从未附加过委托。
-
如果它是用户控件,而不是使用通知属性,最好将
IsInEditMode设置为依赖属性,以便控件的最终用户可以绑定它。因此,控件变得与 VM 无关,大多数控件都是,并使用 Gaz 的答案作为在控件内部访问IsInEditMode的一种方式。 -
感谢使用 DependencyProperty 的建议。
标签: wpf user-controls viewmodel code-behind datacontext