2010-07-19 56 views
2

我是C#和.net平台的全新世界,所以请对我轻松点。 这个论坛帮助我解决了一些我在做项目时遇到的问题,但是现在我已经坚持了几天。 我想要实现的是通过向其传递字符串来设置组合框的selecteditem。 该场景是: 我有一个数据表,并将即将组合的itemssource设置为该datatable.DefaultView。 另外我设置了组合的DisplayMemberPath,到目前为止一切正常,项目显示在组合框中。 除此之外,我还有一个字符串,其中也包含了组合框内的一些值。 所以我试图将组合的selectedItem属性是这样的:C#.NET4 WPF - 从字符串中设置combobox selecteditem

combo.SelectedItem = mystring; 

正如您可以猜到,它不工作。奇怪的是,当我这样做:

combo.Items.Add(mystring); 
combo.SelectedItem = mystring; 

它的工作。所以这就是为什么我很困惑!

编辑:

我只是找到了解决办法:

combo.ItemsSource = datatable.DefaultView; 
combo.DisplayMemberPath = "yourpath"; 
combo.SelectedValuePath = "yourpath"; 
combo.SelectedValue = mystring; 

因此,关键是要设置SelectedValuePath和的SelectedValue属性。 我不知道这是一个很好的编程习惯,但这正是我所需要的。

回答

-1

我认为使用findby将努力使其像

combo.ClearSelection(); 
combo.Items.FindByValue(mystring).Selected = true; 
+0

我不知道这是我的错在某些方面,或者可能是在.net4中的新东西,但没有ClearSelection方法既不FindByValue组合框。我在论坛上发现了一些这样的例子,但他们不工作,所以我发布了这个问题。 – Doktor83 2010-07-19 11:42:33

+0

对啊,对不起,那很奇怪。它是您正在使用的DropDownList吗?或者像一个ListView?我似乎无法找到任何建议ClearDownList或FindByValue已被删除的DropDownList的。 – 2010-07-19 11:50:46

+0

它只是一个简单的Combobox控件,我从工具箱中拖动,所以我想这是一个简单的下拉菜单。 – Doktor83 2010-07-19 11:55:18

3

你做错了什么。

下面是一个演示应用程序,显示此应用程序(该项目应命名为“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,如果你运行这个应用程序,你会发现两个版本按预期工作。当您单击该按钮时,组合框会正确更新。这表明你的代码在其他方面是错误的。不知道是什么,因为你没有给我们足够的细节来确定这一点。但是,如果您运行示例并将其与代码紧密地进行比较,则可能会发现这一点。

+0

[这是我的SkyDrive上的项目](http://cid-f8be9de57b85cc35.office.live.com/self.aspx/Public/StringCombo/StringCombo.zip) – Will 2010-07-19 12:05:03

+0

谢谢,这真的有效。 – Doktor83 2010-07-19 12:20:42