【问题标题】:WPF ComboBox Binding to List<string>WPF ComboBox 绑定到 List<string>
【发布时间】:2017-01-06 18:45:42
【问题描述】:

我正在尝试用列表填充 wpf 组合框。我有两个问题。

  1. 它不填充任何内容
  2. 我正在使用数据注释进行验证。它没有在错误显示区域设置“必需”错误消息。

这是我的组合框 XAML:

<Label Target="{Binding ElementName=State}" Grid.Row="10" Grid.Column="0">State:</Label>
        <ComboBox x:Name="State" Margin="10,0,0,10" Grid.Column="1" Grid.Row="10" ItemsSource="{Binding Path=States, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True}"  Validation.Error="Validation_Error" SelectedValue="{Binding Path=FamilyMember.State}"/>   
        <TextBlock Grid.Column="2" Grid.Row="10" Style="{StaticResource TextBlockStyle}" Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=State}" Margin="10,0,0,10"/>

这是我声明和填充我的 States 对象的部分视图模型。

ViewModel 中的属性

public ObservableCollection<string> States;

构造函数:

States = new ObservableCollection<string>();
            States.Add("One");
            States.Add("Two");
            States.Add("Three");
            States.Add("Four");
            States.Add("Five");

这是来自我的 Debug 的证明,证明我正在正确地获取视图的状态。

还有一个问题是我的数据注释错误不起作用 这是我的部分模型:

它适用于其他领域,没有任何问题,如下所示:

【问题讨论】:

  • ViewModel 中的属性public ObservableCollection&lt;string&gt; States; -- 这不是属性。这是一个领域。你不能绑定它。您只能绑定到属性。您需要通过给它{ get; set; } 使其成为一个属性。其次,您“将状态正确地放入视图”的“证明”对我来说没有任何意义;你说“查看”是什么意思?
  • 请注意,在 ItemsSource 绑定上设置 UpdateSourceTrigger=PropertyChanged 和 Mode=TwoWay 是没有意义的,因为绑定永远不会更新源。

标签: c# wpf mvvm combobox


【解决方案1】:

更改此字段:

public ObservableCollection<string> States;

到一个属性:

public ObservableCollection<string> States {get; set;}

即使字段是公开的,绑定也不起作用。

【讨论】:

  • 感谢 CodingYoshi,美国的 Getter 和 setter 解决了填充问题。这真的是一个快速修复。但第二个问题仍然存在。如果未选择我的数据注释验证,或者即使最初加载我的视图时,我的数据注释验证也不会触发,如我的屏幕截图中所示
  • 试试SelectedItem而不是SelectedValue
  • 我发现了问题..为什么它没有触发..因为我缺少模式、NotifyOnValidationError 和 ValidatesOnDataErrors..我直到按照您指定的方式使用 SelectedItem。感谢 CodingYoshi。我将您的原始答案标记为问题的解决方案
  • 但他们都在那里:NotifyOnValidationError=True, ValidatesOnDataErrors=True。不管怎样,很高兴你修好了。
  • @AndyJohnson 这是不正确的。那些巫毒属性与它无关。查查他们。所有这些都是关于绑定更新从控件属性到绑定的viewmodel属性,但ItemsSource不能永远更新viewmodel属性。绝不。这是一种方式,只有。
【解决方案2】:

在您的视图模型中将 States 更改为完整属性,并在您的 xaml 文件的组合框中添加显示成员路径。

查看模型:

public ObservableCollection<string> _state = new ObservableCollection<string>();
public ObservableCollection<string> States 
{
 get{return _state;}
set {_state = value; OnPropertyChange("States");}
}

如果您需要更多说明,请参阅此页面: https://www.codeproject.com/Articles/301678/Step-by-Step-WPF-Data-Binding-with-Comboboxes

【讨论】:

  • DisplayMemberPath 在绑定到字符串集合时没有意义。
猜你喜欢
  • 2012-12-19
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2014-01-31
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多