2017-02-15 16 views
1

を示す結合私はコンボボックスとテキストブロックを作成したのviewmodelの同じプロパティにバインドさこのC#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が適切に更新されます。私は

IsSynchronizedWithCurrentItem = "True" を

を削除した場合、コンボボックスには、 "空" の値を示しています。言語のSelectedItemは(デバッグによって)正しいオブジェクトを持つ必要があります。

LanguageViewModelは、言語モデルのobsertvablecollectionです。言語モデルは、(ReSharperので)オーバーライドイコールとgethascodeを実施し、1つの文字列の属性の言語を持っていました:

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'リストの1つとして設定する必要があります。そのため、ComboBoxは正しく表示できず、ComboBoxにそのような項目がなく、選択できません。 – Shakra

答えて

0

実際には、あなたの問題は

....全く明らかではないが、あなたはこのの

結果は、コンボボックス

に私に間違ったのSelectedItemを示していると述べたしかし、あなたは何をしますかそうだと思いますか? VMから現在の項目を設定しようとしていますか?

コードをさらに投稿してください。ここ

はコンボボックス、テキストブロックとのviewmodel間interractionの作業サンプルである

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

Shakraが指摘しているように、オリジナルの投稿のコメントの中で、選択項目の設定に問題がありました。私はちょうどアイテムアイテムとしてそれを設定しませんでした。 – Crooker

関連する問題