事件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