事件bubling \路由等工程的依赖对象一个视觉\逻辑树。您的NotificationObject
不是依赖项对象,也不在可视化树中托管....我们在可视化树中拥有的复选框(绑定到您的NotificationObject
)。
非MVVM
在你的DataGrid你会与一些标识标签的复选框,然后使用ButtonBase.Click =“”在数据网格级别事件会为任何click事件处理冒泡任何按钮(例如按钮,菜单项,切换按钮,复选框,单选框,组合框),它们在数据网格的整个可视化树中被点击。
在处理程序中,验证e.OriginalSource
是否为复选框,其Tag
与我们在数据网格的XAML中设置的标识值是否相同。这样我们就知道CheckBox被点击了。
E.g.
<DataGrid AutogenerateColumns="False"
ItemsSource="{Binding NotificationObjectCollection}"
ButtonBase.Clicked="OnNotificationCheckBoxClicked">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsClicked}"
Header="Click?">
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="{x:Type CheckBox}">
<Setter Property="Tag" Value="IsClickCheckBox" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
private void OnNotificationCheckBoxClicked
(object sender, RoutedEventArgs e)
{
if (e.OriginalSource is CheckBox)
{
if (((CheckBox)e.OriginalSource).Tag == "IsClickCheckBox")
{
var notificationObject
= ((CheckBox)e.OriginalSource).DataContext
as NotificationObject;
if (notificationObject.IsClicked) { }
else { }
}
}
}
MVVM
的唯一方法MVVM可以是通过使用Command
执行作为底层NotificationObject
通知祖先对象在视觉被选中(调用setter时),我们执行提供给所述命令NotificationObject
。
为此,使用基于RelayCommand
或DelegateCommand
弱引用(如在互联网上公布)。
添加新NotificationObject
构造
private ICommand _isClickedCommand;
public NotificationObject(ICommand isClickedCommand)
{
_isClickedCommand = isClickedCommand;
}
private bool _isClicked;
public bool IsClicked
{
get
{
return _isClicked;
}
set
{
if (_isClicked != value)
{
_isClicked = value;
OnPropertyChanged("IsClicked");
isClickedCommand.Execute(this);
}
}
}
使用通知对象
public class ItemObjectViewModel
{
private DelegateCommand<NotificationObject>
_notificationObjectClickedCommand
= new DelegateCommand<NotificationObject>(
OnNotificationObjectCommandExecute);
....
private void PopulateCollection()
{
NotificationObjectCollection
= new ObservableCollection<NotificationObject>();
NotificationObjectCollection.Add(
new NotificationObject(_notificationObjectClickedCommand));
}
private void OnNotificationObjectCommandExecute(
NotificationObject notificationObject)
{
if (notificationObject.IsClicked) { }
else { }
}
}
您也可以实现用“非MVVM情景ICommand
基于行为的RoutedCommand '
让我知道这是否有帮助...
谢谢你的全面解答。我使用了非MVVM示例,并对它进行了调整,以便在确认它是单击的复选框时,我直接修改了ItemObjectViewModel,而不是通过NotificationObject。 – MHTri