你做錯了什麼。
下面是一個演示應用程序,顯示此應用程序(該項目應命名爲「StringCombo」)。
<Window
x:Class="StringCombo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
ResizeMode="CanResize">
<Window.DataContext>
<ViewModel
xmlns="clr-namespace:StringCombo" />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox
Name="OldeFashonedCombo" />
<Button
Grid.Column="1"
Content="Select Olde Waye"
Click="Button_Click" />
<ComboBox
Grid.Row="1"
ItemsSource="{Binding Strings}"
SelectedItem="{Binding SelectedString}" />
<Button
Grid.Row="1"
Grid.Column="1"
Content="Select New Way"
Command="{Binding SelectString}" />
</Grid>
</Window>
我們有兩個組合和兩個按鈕。一個使用舊的winforms代碼隱藏方法來操作組合,另一個使用新的MVVM模式。
在這兩種情況下,用戶單擊按鈕,它將設置組合的SelectedValue和UI上的組合更新。
這裏的代碼隱藏版本:我不使用「雙」的同一個「實例」
public MainWindow()
{
InitializeComponent();
OldeFashonedCombo.Items.Add("One");
OldeFashonedCombo.Items.Add("Two");
OldeFashonedCombo.Items.Add("Three");
}
private void Button_Click(object sender, RoutedEventArgs e)
{
OldeFashonedCombo.SelectedItem = "Two";
}
通知;在.NET平臺中,字符串不需要「實現」,或者自動重用相同的實例。 object.ReferenceEquals("Two","Two")
總是如此。
因此,我添加字符串到Items集合中,並且當單擊按鈕時,我將SelectedItem設置爲「Two」。 SelectedItem是Items
集合中應該選擇的實際實例。 SelectedValue是顯示值;你可以選擇這個IIRC,但我不會那麼做爲最佳做法。
這裏的MVVM版本:
public sealed class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<string> Strings { get; private set; }
public ICommand SelectString { get; private set; }
public string SelectedString { get; set; }
public ViewModel()
{
Strings = new ObservableCollection<string>();
Strings.Add("Foo");
Strings.Add("Bar");
Strings.Add("Baz");
SelectString = new SelectStringCommand
{
ExecuteCalled = SelectBar
};
}
private void SelectBar()
{
SelectedString = "Bar";
// bad practice in general, but this is just an example
PropertyChanged(this, new PropertyChangedEventArgs("SelectedString"));
}
public event PropertyChangedEventHandler PropertyChanged;
}
/// <summary>
/// ICommands connect the UI to the view model via the commanding pattern
/// </summary>
public sealed class SelectStringCommand : ICommand
{
public Action ExecuteCalled { get; set; }
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
ExecuteCalled();
}
}
再次,因爲實習的,我沒有使用的字符串相同的「實例」。要查看ViewModel如何連接到UI,請檢查ComboBox和Button上的綁定(如果您還沒有查看它,我強烈建議爲MVVM放棄代碼隱藏,可能需要更多努力才能找到它但從長遠來看它更好)。
ANYHOW,如果你運行這個應用程序,你會發現兩個版本按預期工作。當您單擊該按鈕時,組合框會正確更新。這表明你的代碼在其他方面是錯誤的。不知道是什麼,因爲你沒有給我們足夠的細節來確定這一點。但是,如果您運行示例並將其與代碼緊密地進行比較,則可能會發現這一點。
我不知道這是我的錯在某些方面,或者可能是在.net4中的新東西,但沒有ClearSelection方法既不FindByValue組合框。我在論壇上發現了一些這樣的例子,但他們不工作,所以我發佈了這個問題。 – Doktor83 2010-07-19 11:42:33
對啊,對不起,那很奇怪。它是您正在使用的DropDownList嗎?或者像一個ListView?我似乎無法找到任何建議ClearDownList或FindByValue已被刪除的DropDownList的。 – 2010-07-19 11:50:46
它只是一個簡單的Combobox控件,我從工具箱中拖動,所以我想這是一個簡單的下拉菜單。 – Doktor83 2010-07-19 11:55:18