2017-02-15 4 views
1

Я создал выпадающий и TextBlock привязываться к тому же собственности ViewModelC# ComboBox связывания показывают неправильно выбранный элемент

<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, текстовый блок правильно обновляется. Если удалить

IsSynchronizedWithCurrentItem = "True"

затем выпадающий показывает "пустое" значение. SelectedItem of Language должен иметь правильный объект (путем отладки).

LanguageViewModel состоит из непреодолимого коллекционирования языка. Язык модель реализована переопределение приравнивает и 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); 
} 

Что изменить, что выпадающий показывает правый деталь?

+0

как установить/получить _LanguagesViewModel.SelectedItem_? – Ron

+0

'LanguagesViewModel.SelectedItem = Show.LanguageLink;' Его срабатывает при настройке другого шоу. – Crooker

+1

Проблемы в том, что вы выбрали выбранный элемент неправильно, вам нужно установить выбранный элемент в качестве одного из списка «LanguagesViewModel.Items». Вот почему вы ComboBox не можете показать это правильно, нет такого элемента в ComboBox и он не может его выбрать. – Shakra

ответ

0

На самом деле, ваша проблема не ясно вообще ....

Вы сказали

Результат этого показывает мне неправильно SelectedItem в комбобоксе

Но что вы делаете сказать? Вы пытаетесь установить текущий элемент из своей виртуальной машины?

Пожалуйста, разместите больше своего кода.

Вот рабочий образец interraction между TextBlock, поле со списком и ViewModel

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(); 
    } 
} 

ViewModel

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)); 
    } 
} 
+0

Проблема заключалась в настройке выбранного элемента, как указано Shakra в комментариях по оригинальному сообщению. Я как раз не установил его как деталь деталя. – Crooker

Смежные вопросы