2017-02-15 58 views
1

我创建组合框和文本块绑定到视图模型C#组合框绑定错误显示所选项目

<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属性(永远是第一位)的同一属性。文本块始终是正确的值。当我在组合框中选择不同的值时,文本块会正确更新。如果删除

IsSynchronizedWithCurrentItem = “真”

然后组合框表示 “空” 值。 SelectedItem of Language应该有正确的对象(通过调试)。

LanguageViewModel包含语言模型的obsertvablecollection。语言模型已经实施首要等于和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的工作示例

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