你做错了什么。
下面是一个演示应用程序,显示此应用程序(该项目应命名为“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