【问题标题】:Wpf Combobox with databinding: initial value is empty带有数据绑定的Wpf Combobox:初始值为空
【发布时间】:2015-10-15 14:34:06
【问题描述】:

在下面的 xaml 片段中,SessoList 是一个字符串列表(“M”和“F”)。

<ComboBox IsEditable="False" Margin="5" SelectedValue="{Binding Sesso}" ItemsSource="{Binding SessoList}"  Width="40" Height="28"/>

组合框按预期工作,并且已预先填充以反映视图模型中的 Sesso 值。

组合框的可选项目只有两个并且是固定的,所以我尝试在 xaml 中简化它们的定义:

 <ComboBox IsEditable="False" Margin="5" SelectedValue="{Binding Sesso}" SelectedValuePath="{Binding Tag}" Width="40" Height="28" Name="Primo">
            <ComboBoxItem Content="M" Tag="M" />
            <ComboBoxItem Content="F" Tag="F" />
        </ComboBox>

此组合框能够更新视图模型属性 sesso,但未预先填充正确的值。

报如下错误:

BindingExpression path error: 'Tag' property not found on 'object'

如何在 xaml 中成功定义组合框项并让它根据 SelectedValue 数据绑定显示正确的值?

忘了说我使用的是 .Net 4.0

【问题讨论】:

    标签: wpf xaml combobox


    【解决方案1】:

    据我所知,您想在 XAML 中定义 ComboBox ItemsSource, 这是对我有用的解决方案:

    1. Xaml 窗口资源:

      <Window.Resources>
      <x:Array x:Key="Array" Type="{x:Type nirHelpingOvalButton:ComboObjectModel}">
          <nirHelpingOvalButton:ComboObjectModel Content="M_Content" Tag="M_Tag"/>
          <nirHelpingOvalButton:ComboObjectModel Content="F_Content" Tag="F_Tag"/>
      </x:Array>
      

    2. Xaml 组合:

      <Grid>
      <ComboBox IsSynchronizedWithCurrentItem="True"  IsEditable="False" SelectedIndex="0" Margin="5" ItemsSource="{StaticResource Array}" 
                SelectedValue="{Binding Content, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                SelectedValuePath="Tag" Width="90" Height="28" Name="Primo">
          <i:Interaction.Behaviors>
              <nirHelpingOvalButton:CustomComboSelectionBehavior/>
          </i:Interaction.Behaviors>
          <ComboBox.ItemTemplate>
              <DataTemplate>
                  <TextBlock Text="{Binding Content}"></TextBlock>
              </DataTemplate>
          </ComboBox.ItemTemplate>
      </ComboBox></Grid>
      
    3. 查看模型组合 SelectedValue 绑定属性:

      public string Content
      {
          get { return _content; }
          set
          {
              _content = value;
              OnPropertyChanged("Content");
          }
      }
      
    4. 列表项行为代码:

          protected override void OnAttached()
      {
          base.OnAttached();
          AssociatedObject.Loaded += OnLoaded;
      }
      
      private void OnLoaded(object sender, RoutedEventArgs e)
      {
          var firstItem = AssociatedObject.ItemsSource.Cast<object>().FirstOrDefault();
          AssociatedObject.SelectedItem = firstItem;
      }
      
      protected override void OnDetaching()
      {
          base.OnDetaching();
          AssociatedObject.Loaded -= OnLoaded;
      }
      

    问候

    【讨论】:

    • 不需要定义资源数组,comboboxitem 方法也很好用。比较 Combobox 定义我发现我的代码中的错误: SelectedValuePath="{Binding Tag}" 错误,替换为 SelectedValuePath="Tag" 行为正常跨度>
    猜你喜欢
    • 2013-05-31
    • 2015-05-06
    • 2015-09-10
    • 2014-08-27
    • 2011-05-06
    • 2019-06-23
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多