[英]C# ComboBox binding showing wrong selected item
我創建了combobox和textblock綁定到viewmodel的相同屬性
<ComboBox ItemsSource="{Binding LanguagesViewModel.Items}"
ItemTemplate="{StaticResource ComboBoxLanguageTemplate}"
SelectedItem="{Binding LanguagesViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True"
/>
<TextBlock Text="{Binding LanguagesViewModel.SelectedItem.Language}" />
結果顯示我在組合框中錯誤的選擇項(總是第一個)。 Textblock始終是正確的價值。 當我在組合框中選擇不同的值時,文本塊會正確更新。 如果我刪除
IsSynchronizedWithCurrentItem = “真”
然后組合框顯示“空”值。 SelectedItem of Language應該有正確的對象(通過debuging)。
LanguageViewModel包含語言模型的obsertvablecollection。 語言模型已經實現了重寫equals和gethascode(通過resharper)並且有一個字符串屬性語言:
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);
}
組合框顯示正確的項目有什么變化?
實際上,你的問題根本不清楚......
你說
結果顯示我在組合框中選擇了錯誤的選項
但你怎么這么說呢? 您嘗試從VM設置當前項目?
請發布更多代碼。
這是組合框,文本塊和視圖模型之間的交互的工作示例
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>
MainWindow代碼落后
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));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.