簡體   English   中英

從組合框MVVM WPF中獲取價值c#

[英]Getting Value From Combo Box MVVM WPF c#

我正在嘗試獲取MVVM中ComboBox的值,並將其傳遞給我的ViewModel。

我的xaml組合框是..

<ComboBox 
   DataContext="{StaticResource WorkorderGroups}" 
   Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
   Height="20" 
   ItemsSource="{Binding Path=AllC}" 
   SelectedItem="{Binding Path=SelectedC, Mode=TwoWay}"
/>

然后在WorkorderView中設置所選項目

  public List<long?> AllC
    {
        get
        {
            return _workorderRepository.GetCustomersID();
        }
        set
        {
            if (value == _workorderRepository.GetCustomersID())
                return;

            value = _workorderRepository.GetCustomersID();

            base.OnPropertyChanged("AllC");
        }
    }



    public string SelectedC
    {
        get
        {          
                return item;              
        }
        set
        {
                item = value;    
                OnPropertyChanged("SelectedC");
        }
    }

然后在按鈕上單擊我試圖在AllWorkorderViewModel中訪問它,我正在使用以下代碼...

    public ICommand Test
    {
        get
        {
            if (_test == null)
            {
                _test = new RelayCommand(
                    param => this.Testy()
                        );
            }
            return _test;
        }
    }

    public void Testy()
    {

            List<string> s = this.AllWorkorders.Select(C => C.SelectedC).ToList();

            string s1 = s[0];

    }

請忽略方法名稱,這只是草稿代碼。

我的問題是它返回的字符串不是選定的項目,它是一個包含200多個項目的列表,它們全為空。 有誰知道為什么?

謝謝。

這行我聽不懂:

List<string> s = this.AllWorkorders.Select(C => C.SelectedC).ToList();

什么是AllWorkorders 如果您要當前選擇的項目,則它本身就是SelectedC 如果要從其他列表中查找項目,則必須執行var item = AllWorkorders.FirstOrDefault(x => x.YourMatchingProperty == SelectedC)

我不確定您是否了解Select的功能-我覺得您想使用Where / First或Single運算符:檢查以下Linq示例: https : //code.msdn.microsoft.com/101-LINQ-Samples -3fb9811b

您的ViewModel對我來說不太正確。 在這里,您有一個使用MVVM的工作示例:

MainWindow XAML:

  <Grid>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <ComboBox Width="100" Height="20" ItemsSource="{Binding AllC}" SelectedItem="{Binding SelectedC, Mode=TwoWay}" Margin="20"/>
        <Button Width="100" Height="20" Margin="20" Command="{Binding GetValueCombobox}"></Button>
        </StackPanel>


    </Grid>

MainWindow.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();           

    }  
}

MainWindowViewModel:

 public class MainViewModel : INotifyPropertyChanged
    {
        private readonly List<long?> _workorderRepositoryList = new List<long?>() {1, 2, 5, 3, 4};

    public List<long?> AllC
    {
        get { return _workorderRepositoryList; }
        set
        {
            if (value == _workorderRepositoryList)
                return;

            value = _workorderRepositoryList;
            OnPropertyChanged("AllC");
        }
    }


    private string item;

    public string SelectedC
    {
        get { return item; }
        set
        {
            item = value;
            OnPropertyChanged("SelectedC");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }


    public ICommand EvaluateStateCommand
    {
        get
        {
            return new RelayCommand(parameter =>
            {
                var myItem = SelectedC;
                //your selected item (the value of the combo) is represented by SelectedC

            });
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM