0

我有一个带有一些值的 ComboBox,我希望同时进行两件事。

这是我的组合框,我想将 10 显示为默认值并将其绑定到双精度值?距离属性。

<ComboBox Grid.Row="5" Grid.Column="1"
          SelectedIndex="1"
          SelectedValue="{Binding Distance, Mode=TwoWay, Converter={StaticResource StringToDoubleConverter}}">
    <ComboBoxItem>1</ComboBoxItem>
    <ComboBoxItem IsSelected="True">10</ComboBoxItem>
    <ComboBoxItem>100</ComboBoxItem>
    <ComboBoxItem>1000</ComboBoxItem>
</ComboBox>

这是转换器:

public class StringToDoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        ComboBoxItem item = value as ComboBoxItem;

        if (item != null)
        {
            double d;
            if (double.TryParse(item.Content.ToString(), out d))
                return d;
        }

        return null;
    }
}

问题在于,在此代码中,所选项目 10 未在应用程序启动时显示。如果我将使用转换器删除该行,那么它将显示所选项目 10,但是,我不能将它绑定到双精度?距离属性。我不想为它写一个代码,例如:Convert.ToDouble(combobox1.SelectedValue)...

我该怎么做才能使这两件事都起作用?

4

1 回答 1

0

您需要从 ViewModel 填充组合框项目。此外,您不应使用SelectedValue属性,而应使用SelectedItem. 请参见下面给出的代码。

XAML

<ComboBox x:Name="cmb" ItemsSource="{Binding DistanceCollection}"
                     SelectedItem="{Binding Distance, Converter={StaticResource StringToDoubleConverter}, Mode=TwoWay}"/>

视图模型

public class viewModel : INotifyPropertyChanged
{
    public viewModel()
    {
        DistanceCollection = new ObservableCollection<string> 
        {
            "1",
            "10",
            "100",
            "1000"
        };

        Distance = double.Parse(DistanceCollection[1].ToString());
    }

    public ObservableCollection<string> DistanceCollection { get; set; }

    private double _Distance;
    public double Distance
    {
        get 
        { 
            return _Distance; 
        }
        set
        {
            _Distance = value;
            OnPropertyChanged("Distance");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

转换器

public class StringToDoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        string item = value as string;

        if (!string.IsNullOrWhiteSpace(item))
        {
            double d;
            if (double.TryParse(item, out d))
                return d;
        }

        return null;
    }
}
于 2013-08-24T05:41:08.327 回答