ListBox控件沒有實現Command屬性。我必須將一些功能附加到SelectionChanged事件。有人知道我該怎麼做?請幫我如何在MVVM列表框中實現SelectionChanged Silverlight
回答
我更喜歡使用與SelectedItem
的綁定並在綁定屬性的設置中實現任何功能。
<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
...
public class ViewModel
{
public IEnumerable<Item> Items { get; set; }
private Item selectedItem;
public Item SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem == value)
return;
selectedItem = value;
// Do logic on selection change.
}
}
}
覺得這個職位從洛朗比尼翁將幫助您解決問題:
支柱上方提到的DataGrid,但我不認爲它會與列表框的工作呢!
此致敬禮和新年快樂! :)
我會建議使用RelayCommand
。請使用MVVM Light Toolkit或僅使用Josh Smith's implementations中的RelayCommand
和CommandManager
類。我個人只使用這兩個類,所以我不需要整個工具包。
雖然這肯定會起作用,但根據您所做的事情,可能會有更簡單的方法。將對象綁定到ListBox
的SelectedValue
並監聽該值以更改可能會更容易。
謝謝你的所有幫助)新年快樂! – 2012-01-02 12:40:38
基本上,你有幾種選擇:
- 使用ListBox的屬性的SelectedItem綁定到一個屬性在後端(即視圖模型)並按照Cameron MacFarland所述在setter中執行邏輯。
- 使用具有通用事件的第三方庫來命令行爲,如鏈接Pedro Lamas。
- 如果您不想使用第三方庫或在屬性設置器內部編寫邏輯有點不可接受,您可以爲ListBox控件創建自己的行爲。它會訂閱控件的
SelectionChanged
事件並執行一個命令(該命令可能是行爲公開的依賴項屬性)。
這是可以達到選擇的方式改變事件在你的MVVM應用 首先我告訴你,命令屬性只在按鈕的工作,現在我們不得不明確 綁定屬性我們選擇改變事件就像你XMAL列表框或組合框 文件
<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118">
<Local:Interaction.Triggers>
<Local:EventTrigger EventName="SelectionChanged">
<Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/>
</Local:EventTrigger>
</Local:Interaction.Triggers>
</ListBox>
爲此,你必須添加DLL Syatem.Windows。互動 現在u必須在你的XAML文件命名空間在您的視圖模型類中添加像
xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity"
引用您在崑崙結構來定義你的命令
public ViewModel123()
{
MyCommand = new RelayCommand<string>(TestMethod);
}
現在創建TestMethod的方法,它可以處理選擇更改事件
private void TestMethod(string parameter)
{
MessageBox.Show(parameter);
}
我希望這可以幫助你。
我更喜歡這種方式,因爲我認爲它更乾淨。 – 2013-07-05 04:56:42
優秀的提示,謝謝 – James 2012-07-31 02:47:47
它可以與多選? – Simsons 2013-03-07 12:09:43
@Simsons只有你有辦法綁定到多個選擇。我相信SelectedItem屬性在多選時會被忽略。 – 2013-03-07 13:50:22