【发布时间】:2017-12-30 16:34:32
【问题描述】:
我有一个附加属性可在数据网格中使用,以便可以在我的视图模型中使用 SelectedItems。代码是这样的:
public class DataGridSelectedItemsAttachedProperty
{
#region SelectedItems
///
/// SelectedItems Attached Dependency Property
///
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.RegisterAttached("SelectedItems", typeof(IList),
typeof(DataGridSelectedItemsAttachedProperty),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
new PropertyChangedCallback(OnSelectedItemsChanged)));
public static IList GetSelectedItems(DependencyObject d)
{
return (IList)d.GetValue(SelectedItemsProperty);
}
public static void SetSelectedItems(DependencyObject d, IList value)
{
d.SetValue(SelectedItemsProperty, value);
}
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGrid miDg = (DataGrid)d;
miDg.SelectionChanged += dataGrid_SelectionChanged;
miDg.Unloaded += dataGrid_Unloaded;
}
private static void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid miDg = (DataGrid)sender;
//Get list box's selected items.
IEnumerable miDgSelectedItems = miDg.SelectedItems;
//Get list from model
IList ModelSelectedItems = GetSelectedItems(miDg);
//Update the model
ModelSelectedItems.Clear();
if (miDg.SelectedItems != null)
{
foreach (var item in miDg.SelectedItems)
ModelSelectedItems.Add(item);
}
SetSelectedItems(miDg, ModelSelectedItems);
}
private static void dataGrid_Unloaded(object sender, RoutedEventArgs e)
{
DataGrid miDg = sender as DataGrid;
miDg.SelectionChanged -= dataGrid_SelectionChanged;
miDg.Unloaded -= dataGrid_Unloaded;
}
#endregion
}
问题是这个数据网格在一个选项卡控件中,事件卸载被触发,所以事件被取消订阅,然后 SelectedItems 不再通知给视图模型。
所以我想知道如何解决这个问题,也许在另一个地方取消订阅事件而不是卸载事件?
谢谢。
【问题讨论】:
-
为什么要在这种情况下取消订阅?
-
对。真的,这是我发现的一个例子,我认为这是一个很好的解决方案。但我认为在这种情况下不需要取消订阅,因为附加属性必须与用户控件同时存在,当我关闭用户控件时,附加属性将被重新收集,因为没有对象引用它.所以在这种情况下,我想它也是 unneded。
标签: c# wpf datagridview attached-properties