簡體   English   中英

WPF selectitem值綁定

[英]WPF selecteditem value binding

我有綁定字典的組合框

字典:

public Dictionary<string,DateTime> TimeItems { get; set; }

<ComboBox Grid.Column="3"
      HorizontalContentAlignment="Center"
      VerticalContentAlignment="Center"
      ItemsSource="{Binding TimeItems}"
      SelectedIndex="0"
      SelectedItem="{Binding SelectedItem}">

我如何綁定到public DateTime SelectedItem { get; set; } public DateTime SelectedItem { get; set; } public DateTime SelectedItem { get; set; } TimeItems

您可以使用轉換器將Dictionary的值綁定到SelectedItem。

public class DictionaryValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((KeyValuePair<string, DateTime>)value).Value;
    }
}

XAML

<ComboBox Grid.Column="3" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
    ItemsSource="{Binding TimeItems}"
    SelectedItem="{Binding SelectedItem, Converter={StaticResource DictionaryValueConverter}}" />

如果僅對顯示和檢索Dcitionary的值感興趣,則可以使用以下選項

視圖模型

class ExpenseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propName)
    {
        var pc = PropertyChanged;
        if (pc != null)
        {
            pc(this, new PropertyChangedEventArgs(propName));
        }
    }

    private void Populate()
    {
        _mySource.Add("Test 1", DateTime.Now);
        _mySource.Add("Test 2", DateTime.Now.AddDays(1));
        _mySource.Add("Test 3", DateTime.Now.AddDays(2));
        _mySource.Add("Test 4", DateTime.Now.AddDays(3));
        NotifyPropertyChanged("MySource");
    }
    private Dictionary<string, DateTime> _mySource;
    public Dictionary<string, DateTime> MySource
    {
        get { return _mySource; }
    }

    public ExpenseViewModel()
    {
        _mySource = new Dictionary<string, DateTime>();
        Populate();
    }
    public DateTime SelectedDate
    {
        get;
        set;
    }
}

View.xaml

<StackPanel HorizontalAlignment="Left">
    <StackPanel.Resources>
        <local:Converters x:Key="Converter"/>
    </StackPanel.Resources>
    <ComboBox x:Name="cmbBox" Width="200" Margin="10,0,20,0" ItemsSource="{Binding MySource, Converter={StaticResource Converter}}" 
          SelectedItem="{Binding SelectedDate, Mode=TwoWay}" Height="20">

    </ComboBox>
</StackPanel>

其中本地是包含轉換器Converter的項目的xmlns

public class Converters : IValueConverter
{
    private static readonly PropertyInfo InheritanceContextProp = typeof(DependencyObject).GetProperty("InheritanceContext", BindingFlags.NonPublic | BindingFlags.Instance);

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dic = value as Dictionary<string, DateTime>;
        return dic.Values;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

鑒於代碼背后,我剛剛定義了datacontext

您可以將SelectedValuePath設置為“ Value”(因為每個項目都是一個KeyValuePair),然后將SelectedValue屬性綁定到您的屬性:

<ComboBox Grid.Column="3"
  HorizontalContentAlignment="Center"
  VerticalContentAlignment="Center"
  ItemsSource="{Binding TimeItems}"
  SelectedIndex="0"
  SelectedValuePath="Value"
  SelectedValue="{Binding SelectedItem}"/>

嘗試這個:

foreach (KeyValuePair<string,DateTime> values in TimeItems){
         comboBox.Items.Add(values.Value);
         }

暫無
暫無

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

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