【问题标题】:Getting Value From Combo Box MVVM WPF c#从组合框MVVM WPF c#中获取价值
【发布时间】:2015-04-16 09:37:29
【问题描述】:

我正在尝试获取 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 多个项目的列表,它们都是空的。有谁知道为什么?

谢谢。

【问题讨论】:

  • 一个问题是SelectedC 应该是来自AllC 的一个实例。如果它是来自上一个调用的实例,并且AllC 中的最后一个调用返回了与SelectedC 不同(等效)的实例,那么您就破坏了组合框的工作方式。

标签: c# wpf mvvm combobox


【解决方案1】:

这行我看不懂:

List&lt;string&gt; s = this.AllWorkorders.Select(C =&gt; C.SelectedC).ToList();

AllWorkorders 是什么?如果您想要当前选定的项目,那就是 SelectedC 本身。如果你想从其他列表中找到一个项目,你必须这样做var item = AllWorkorders.FirstOrDefault(x =&gt; x.YourMatchingProperty == SelectedC)

我不确定您是否了解 Select 的作用 - 我觉得您想使用 Where/First 或 Single 运算符:查看这些 Linq 示例:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

【讨论】:

  • AllWorkorders 是对 WorkorderView 的引用。我正在使用 select 来尝试选择组合框中已选择的项目。
  • 我明白这一点,但 Select 运算符将一个或多个值投影到不同的形式:msdn.microsoft.com/en-us/library/vstudio/…
【解决方案2】:

您的 ViewModel 对我来说看起来不太正确。这里有一个 MVVM 的工作示例:

主窗口 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();           

    }  
}

主窗口视图模型:

 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

            });
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2012-02-29
    • 2021-09-16
    • 2015-04-27
    • 2014-06-20
    相关资源
    最近更新 更多