【问题标题】:Why is my SelectedValuePath property of my comboBox misbehaving?为什么我的组合框的 SelectedValuePath 属性行为异常?
【发布时间】:2018-03-15 15:44:21
【问题描述】:

我很难找到为什么我的SelectedValuePath 没有导致我的组合框将双精度传递给我的视图模型属性DelayLength。当我在执行期间更改组合框选择时,组合框变为红色并给出错误:

ConvertBack cannot convert value '[2 Seconds, 2]' (type 'KeyValuePair`2'). BindingExpression:Path=DelayLength; DataItem='TestViewModel' (HashCode=62605785); target element is 'ComboBox' (Name=''); target property is 'SelectedItem' (type 'Object') NotSupportedException:'System.NotSupportedException: DoubleConverter cannot convert from System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].

因为我相信我正确地遵循了文档,我是否缺少一些简单的东西?

Window.xaml

    <ComboBox Width="120" Height="24" HorizontalAlignment="Left" Margin="5,0"
              DisplayMemberPath="Key"
              SelectedValuePath="Value"
              ItemsSource="{Binding AvailableLengths}"
              SelectedItem="{Binding DelayLength}"/>

    <TextBox Text="{Binding DelayLength, Mode=OneWay}" IsReadOnly="True"></TextBox>

</StackPanel>

Window.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new TestViewModel();
    }
}

TestViewModel.cs

class TestViewModel : GalaSoft.MvvmLight.ViewModelBase
{
    public Collection<KeyValuePair<string, double>> AvailableLengths
    {
        get
        {
            if (_availableLengths == null)
            {
                _availableLengths = new Collection<KeyValuePair<string, double>>()
                {
                    new KeyValuePair<string, double>("None", 0),
                    new KeyValuePair<string, double>("0.5 Seconds", 0.5),
                    new KeyValuePair<string, double>("1 Second", 1),
                    new KeyValuePair<string, double>("2 Seconds", 2),
                    new KeyValuePair<string, double>("3 Seconds", 3)
                };
            }

            return _availableLengths;
        }
    }

    private double _delayLength;

    public double DelayLength
    {
        get { return _delayLength; }
        set
        {
            _delayLength = value;
            RaisePropertyChanged(nameof(DelayLength));
        }
    }

    private Collection<KeyValuePair<string, double>> _availableLengths;
}

【问题讨论】:

  • SelectedValuePath 应该与 SelectedValue 一起使用,而不是 SelectedItem。
  • @Clemens 完美。这解决了它。谢谢。

标签: c# wpf data-binding


【解决方案1】:

SelectedValuePath 不能与SelectedItem 一起使用。你必须使用SelectedValue

来自 MSDN 的自定义摘要:

SelectedValuePath 属性提供了一种方法来指定 SelectedItem 的 SelectedValue。 SelectedItem 代表一个 Items 集合和 Control 中的对象显示 a 的值 所选项目的单个属性。 SelectedValuePath 属性 指定用于确定值的属性的路径 的 SelectedValue 属性。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多