이벤트 bubling \ 라우팅 등이에 종속 개체에 대한 작업 시각적 \ 논리 트리. 귀하의 NotificationObject
은 종속성 개체가 아니며 시각적 트리에서 호스팅되지도 않습니다. 우리가 시각적 트리에서 가지고있는 것은 체크 박스 (귀하의 NotificationObject
에 묶여 있음)입니다. 당신은 당신이 = "ButtonBase.Click을 신분증으로 체크 박스를 태그 한 후 사용해야 데이터 그리드에서"모든 클릭 이벤트에 대한 처리됩니다 데이터 그리드 레벨에서 이벤트가 어떤 버튼 버블
비 MVVM (button, menuitems, togglebuttons, checkboxes, radioboxes, comboboxes와 같은) 데이터 항목의 전체 시각적 트리에서 클릭을 가져옵니다.
핸들러에서 e.OriginalSource
이 체크 박스이고 해당 Tag
이 DataGrid의 XAML에 설정 한 식별 값과 동일한 지 확인합니다. 그렇게하면 CheckBox가 클릭되었음을 알 수 있습니다.
예 :
<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 인 기본 NotificationObject
등 Command
실행을 사용하여 시각적으로 상위 객체를 통지 할 수있는 유일한 방법 MVVM은 (세터가 호출) 우리는 공급 된 명령을 실행 체크 얻는다
NotificationObject
.
는이 목적을 위해 (인터넷에서 사용할 수 등) RelayCommand
또는 DelegateCommand
을 기반으로 약한 참조를 사용합니다.
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
를 기반으로 동작을 달성 할 수있는 알림 개체를 사용하여 새로운 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);
}
}
}
추가 RoutedCommand '
도움이 필요하시면 알려주세요 ...
종합적인 답변을 주셔서 감사합니다. MVMS가 아닌 예를 사용하고이를 수정하여 클릭 한 확인란이라는 것을 확인한 후에 NotificationObject를 거치지 않고 직접 ItemObjectViewModel을 수정했습니다. – MHTri