当前位置: 首页 > 知识库问答 >
问题:

C#组合框绑定显示错误的选定项

司迪
2023-03-14

我创建了绑定到viewmodel相同属性的combobox和textblock

<ComboBox ItemsSource="{Binding LanguagesViewModel.Items}"
                  ItemTemplate="{StaticResource ComboBoxLanguageTemplate}"
                  SelectedItem="{Binding LanguagesViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                  IsSynchronizedWithCurrentItem="True"
                  />
<TextBlock Text="{Binding LanguagesViewModel.SelectedItem.Language}" />

结果是在组合框中显示错误的selecteditem(总是第一个)。Textblock总是有正确的值。当我在combobox中选择不同的值时,textblock会正确更新。如果我移除

IsSynchronizedWithCurrentItem=“真”

然后组合框显示“空”值。语言的选择项目应该有正确的对象(通过调试)。

LanguageViewModel由languagemodel的obsertvablecollection组成。语言模型已经实现了重写equals和gethascode(由resharper实现),并且有一个字符串属性Language:

protected bool Equals(LanguageModel other)
{
    return string.Equals(_language, other._language);
}

public override bool Equals(object obj)
{
    if (ReferenceEquals(null, obj)) return false;
    if (ReferenceEquals(this, obj)) return true;
    if (obj.GetType() != this.GetType()) return false;
    return Equals((LanguageModel) obj);
}

public override int GetHashCode()
{
    return (_language != null ? _language.GetHashCode() : 0);
}

如何更改组合框显示正确的项目?

共有1个答案

王经赋
2023-03-14

事实上,你的问题一点也不清楚。。。。

你说过

结果在组合框中显示错误的选定项

但是你怎么会这么说呢?你尝试从你的虚拟机设置当前项目?

请发布更多您的代码。

这是组合框、文本块和视图模型之间交互的工作示例

XAML

<Window x:Class="So42246496.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:So42246496"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance {x:Type local:LanguageViewModel}}"

    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate x:Key="ComboBoxLanguageTemplate">
        <TextBlock Text="{Binding Language}"></TextBlock>
    </DataTemplate>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="47*"/>
        <RowDefinition Height="17*"/>
        <RowDefinition Height="17*"/>
    </Grid.RowDefinitions>

    <ComboBox ItemsSource="{Binding Items}"
              ItemTemplate="{StaticResource ComboBoxLanguageTemplate}"
              SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
               Margin="2"
              />
    <TextBlock Text="{Binding SelectedItem.Language}" Grid.Row="1" Margin="2" />
    <Button Grid.Row="2" Content="Next item" Margin="2" Click="ButtonBase_OnClick"></Button>
</Grid>

主窗口代码隐藏

public partial class MainWindow : Window
{
    private LanguageViewModel vm;

    public MainWindow()
    {
        vm = new LanguageViewModel();
        DataContext = vm;
        InitializeComponent();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        vm.NextItemFromViewModel();
    }
}

视图模型

public class LanguageViewModel : INotifyPropertyChanged
{
    private LanguageModel _selectedItem;
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private int currentIndex = 1;
    public LanguageViewModel()
    {
        Items = new ObservableCollection<LanguageModel>();
        Items.Add(new LanguageModel { Language = "fr-FR" });
        Items.Add(new LanguageModel { Language = "en-GB" });
        Items.Add(new LanguageModel { Language = "en-US" });
        Items.Add(new LanguageModel { Language = "de-DE" });
        Items.Add(new LanguageModel { Language = "es-ES" });
        SelectedItem = Items[currentIndex];
    }

    public ObservableCollection<LanguageModel> Items { get; set; }

    public LanguageModel SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem = value; OnPropertyChanged(); }
    }

    public void NextItemFromViewModel()
    {
        SelectedItem = Items[++currentIndex];
    }
}

语言模型

public class LanguageModel : INotifyPropertyChanged
{
    private string _language;

    public string Language
    {
        get { return _language; }
        set
        {
            _language = value;
            OnPropertyChanged();
        }
    }

    protected bool Equals(LanguageModel other)
    {
        return string.Equals(Language, other.Language);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((LanguageModel)obj);
    }

    public override int GetHashCode()
    {
        return (Language != null ? Language.GetHashCode() : 0);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
 类似资料:
  • 我是C#新手,我不断收到以下无法删除的错误。 我的代码如下,我不能确切地说出哪一行导致了错误,但我怀疑它与RibbonRadioButtons有关,因为如果我删除它们,我不会得到错误。只有在单击两个或更多单选按钮后,错误才会出现。ComboBoxItem上的一个回答继续抛出绑定错误,尽管style暗示是多个Refresh()语句导致了这个问题,但我不知道如何避免这个问题。 有人能帮我解决这个问题吗

  • 我有一个组合框,我正在通过收集视图源填充。这些项目是通过传入项目类型的数据板构建的(在本例中为ProjectViewModel)。这是在WPF中。NET 4.0。 在我的窗户里。资源,我指定了以下内容: 尽管有这种风格,我仍然收到以下错误: 系统。Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,ancestor type =”System的绑

  • 我想通过选择combobox项在数据库中的tableview中显示数据。组合框包含用户可以选择的“我的数据库”中的列。我这样做,组合框是好的,代码工作没有错误,但表没有更新。 控制器类: 表类: 多谢!

  • 问题内容: 我正在使用Eclipse IDE开发桌面(秋千)应用程序。我有三个组合框(国家,州和城市),选择新的国家或省时需要自动更新数据。我搜索了很多信息,但是我发现的所有实现都是在Ajax或NetBeans中的bean绑定框架上完成的。我通过ItemEvent尝试了一种解决方案,但是在启动应用程序时遇到了问题,该应用程序加载了国家列表,但没有加载其他列表。通过选择一个国家,国家列表而不是城市列

  • 今天我将我的Android Studio更新为3.0(稳定版)。现在,Android Studio在在 构建和运行应用程序时没有问题。这只会让我对错误消息感到不舒服 这是错误消息。

  • 使用Datagridtemplatecolumn将WPFDatagrid绑定到组合框。很难获得组合框绑定的selectedItem。我发现了类似的例子,但这并不能解决我的问题。 请在下面找到我的 XAML 的代码片段和数据结构: 我在上面定义了一个数据结构,它实现了INotifyPropertychanged接口。 现在,在视图模型中,有一个可观察的X列表集合,即XList,它绑定到XAML中的数