是否可以將命令綁定到ListView的ItemSelectionChanged?怎麼樣?如果不可能,當列表視圖的選擇更改時,還有另一種方法可以調用命令嗎?如何將命令綁定到ListView的ItemSelectionChanged事件?
0
A
回答
1
是 - MVVM-light框架支持將數據綁定到路由事件的命令。見http://blog.galasoft.ch/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand-behavior.aspx
<Rectangle Fill="White"
Stroke="Black"
Width="200"
Height="100">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<cmd:EventToCommand Command="{Binding TestCommand,
Mode=OneWay}"
CommandParameter="{Binding Text,
ElementName=MyTextBox,
Mode=OneWay}"
MustToggleIsEnabledValue="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
0
起初,我在我的項目中使用,其中selectedItems一個傳遞作爲參數的命令。這種方法的缺點是用戶不得不點擊命令按鈕來啓動操作,但這在大多數情況下滿足了我的要求。
實現你想要的東西就像是erash發佈 - 使用一種像mvvm-light一樣的EventToCommand行爲。
另一種方法是創建一個附加的行爲來綁定到viewmodel中的selecteditems。你必須善於下面的代碼的ListView或創造一些更普遍的:)
<DataGrid AttachedProperties:DatagridService.SelectedItemsSource="{Binding SelectedItems, Mode=OneWay}" />
視圖模型:
public ObservableCollection<object> SelectedItems//init collection just ONCE!
{
get
{
if (this.selectedItems == null)
{
this.selectedItems = new ObservableCollection<object>();
this.selectedItems.CollectionChanged +=
new System.Collections.Specialized.NotifyCollectionChangedEventHandler(SelectedItemsCollectionChanged);
}
return this.selectedItems;
}
}
private void SelectedItemsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//this is called when ever the selecteditems changed
}
附加的行爲:
public static class DatagridService
{
#region SelectedItemSource
#region Attached Property Declaration
/// <summary>
/// Identifies the ListBoxExtension.SelectedItemsSource attached property.
/// </summary>
public static readonly DependencyProperty SelectedItemsSourceProperty =
DependencyProperty.RegisterAttached(
"SelectedItemsSource",
typeof(IList),
typeof(DatagridService),
new PropertyMetadata(
null,
new PropertyChangedCallback(OnSelectedItemsSourceChanged)));
#endregion
#region Attached Property Accessors
/// <summary>
/// Gets the IList that contains the values that should be selected.
/// </summary>
/// <param name="element">The ListBox to check.</param>
public static IList GetSelectedItemsSource(DependencyObject element)
{
if (element == null)
throw new ArgumentNullException("element");
return (IList)element.GetValue(SelectedItemsSourceProperty);
}
/// <summary>
/// Sets the IList that contains the values that should be selected.
/// </summary>
/// <param name="element">The ListBox being set.</param>
/// <param name="value">The value of the property.</param>
public static void SetSelectedItemsSource(DependencyObject element, IList value)
{
if (element == null)
throw new ArgumentNullException("element");
element.SetValue(SelectedItemsSourceProperty, value);
}
#endregion
#region IsResynchingProperty
// Used to set a flag on the ListBox to avoid reentry of SelectionChanged due to
// a full syncronisation pass
private static readonly DependencyPropertyKey IsResynchingPropertyKey =
DependencyProperty.RegisterAttachedReadOnly(
"IsResynching",
typeof(bool),
typeof(DatagridService),
new PropertyMetadata(false));
#endregion
#region Private Static Methods
private static void OnSelectedItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGrid grd = d as DataGrid;
if (grd == null)
throw new InvalidOperationException("The DataGridExtension.SelectedItemsSource attached " +
"property can only be applied to DataGrid controls.");
grd.SelectionChanged -= new SelectionChangedEventHandler(OnDataGridSelectionChanged);
if (e.NewValue != null)
{
ListenForChanges(grd);
}
BindingExpression bexp = grd.GetBindingExpression(SelectedItemsSourceProperty);
if (bexp != null)
bexp.UpdateSource();
}
private static void ListenForChanges(DataGrid grd)
{
// Wait until the element is initialised
if (!grd.IsInitialized)
{
EventHandler callback = null;
callback = delegate
{
grd.Initialized -= callback;
ListenForChanges(grd);
};
grd.Initialized += callback;
return;
}
grd.SelectionChanged += new SelectionChangedEventHandler(OnDataGridSelectionChanged);
ResynchList(grd);
}
private static void OnDataGridSelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid grd = sender as DataGrid;
if (grd != null)
{
bool isResynching = (bool)grd.GetValue(IsResynchingPropertyKey.DependencyProperty);
if (isResynching)
return;
IList list = GetSelectedItemsSource(grd);
if (list != null)
{
foreach (object obj in e.RemovedItems)
{
if (list.Contains(obj))
list.Remove(obj);
}
foreach (object obj in e.AddedItems)
{
if (!list.Contains(obj))
list.Add(obj);
}
}
}
}
private static void ResynchList(DataGrid grd)
{
if (grd != null)
{
grd.SetValue(IsResynchingPropertyKey, true);
IList list = GetSelectedItemsSource(grd);
if (grd.SelectionMode == DataGridSelectionMode.Single)
{
grd.SelectedItem = null;
if (list != null)
{
if (list.Count > 1)
{
// There is more than one item selected, but the listbox is in Single selection mode
throw new InvalidOperationException("DataGrid is in Single selection mode, but was given more than one selected value.");
}
if (list.Count == 1)
grd.SelectedItem = list[0];
}
}
else
{
grd.SelectedItems.Clear();
if (list != null)
{
foreach (object obj in grd.Items)
if (list.Contains(obj))
grd.SelectedItems.Add(obj);
}
}
grd.SetValue(IsResynchingPropertyKey, false);
}
}
#endregion
#endregion
}
相關問題
- 1. 如何將事件綁定到指令?
- 2. 如何將ListView.ItemTapped事件綁定到Xamarin Forms中的ViewModel命令?
- 3. 如何將WPF命令綁定到MouseEnter事件?
- 4. 如何將TextBox Textchanghe事件綁定到命令?
- 5. TextEdit_KeyDown事件綁定到一個命令
- 6. WPF MVVM:綁定命令到事件
- 7. 將WPFToolkit DataGrid的事件綁定到ModelView的命令(MVVM)
- 8. 將命令綁定到xctk的'LostMouseCapture'事件:IntegerUpDown
- 9. MVVM Light:將事件綁定到後面代碼中的命令
- 10. 將Ui事件綁定到UWP中的命令
- 11. 將命令綁定到ListView中的按鈕與Caliburn.Micro
- 12. 如何將按鈕命令綁定到主窗口命令
- 13. 如何將用戶控件中的item命令綁定到viewmodel命令?
- 14. 將自定義WPF控件中的事件綁定到ViewModel中的命令
- 15. 如何將MouseDoubleClick-事件綁定到DataGridTemplateColumn
- 16. 如何將FileHelper.CSVEngine綁定到BeforeWriteRecord事件
- 17. 如何將事件綁定到元素?
- 18. 將ComboBoxItem綁定到WPF中的命令?
- 19. 將命令綁定到WPF中的ComboBoxItem
- 20. 命令綁定到WPF中的路由事件用戶控制
- 21. C++/CLR ListView-> ItemSelectionChanged事件未編譯(代表)
- 22. 如何添加命令綁定到不具有命令綁定屬性
- 23. 將ViewModel命令綁定到WPF DataGrid
- 24. WPF:將ContextMenu綁定到MVVM命令
- 25. 使用HierarchicalDataTemplate將命令綁定到MenuItem
- 26. 如何將命令綁定到XAML中的WPF Telerik radMenuItem?
- 27. 如何將Combobox綁定到ReactiveUI中的命令?
- 28. 如何將richtextbox中的WPF超鏈接綁定到命令?
- 29. 是否有任何方法將命令綁定到listview或Combobox選擇?
- 30. 將ObservableCollection綁定到ListView
不能綁定SelectedItems一個屬性? – 2011-05-25 03:04:53
@Derek:這也是一個答案,我認爲 – 2011-05-25 06:06:11
我得到這個:Error 'SelectedItems'屬性是隻讀的,不能從標記中設置。 – 2011-05-25 06:22:18