2010-07-19 44 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

相關問題