2015-01-15 33 views
-1

我有一个WPF应用程序,有很多控件的对话框。我有一个没有从C#绑定到XAML的下拉列表。另一种方式工作正常。双向绑定不能在WPF中工作

这里是C#:

public class AdditionalCostView : ViewBase, IEquatable<AdditionalCostView> 
{ 
    // .. 
    public OfficeReferenceDataView Category 
    { 
     get { return _category; } 
     set 
     { 
      this._category = value; 
      this.OnPropertyChanged("Category"); 
     } 
    } 
    // .. 
} 

,这里是相应的XAML:

<ComboBox Grid.Row="0" Grid.Column="1" Validation.Error="Validation_Error" 
      DisplayMemberPath="Value" SelectedValuePath="ID" 
      ItemsSource="{Binding AllCategories}"> 
    <ComboBox.SelectedItem> 
     <Binding Path="Category" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.NotifyOnValidationError> 
       <sys:Boolean>true</sys:Boolean> 
      </Binding.NotifyOnValidationError> 
      <Binding.NotifyOnSourceUpdated> 
       <sys:Boolean>true</sys:Boolean> 
      </Binding.NotifyOnSourceUpdated> 
      <Binding.NotifyOnTargetUpdated> 
       <sys:Boolean>true</sys:Boolean> 
      </Binding.NotifyOnTargetUpdated> 
      <Binding.ValidationRules> 
       <validators:MandatoryValueValidationRule IsRequired="True" Message="Please select a category."></validators:MandatoryValueValidationRule> 
      </Binding.ValidationRules> 
     </Binding> 
    </ComboBox.SelectedItem> 
</ComboBox> 

结合工作正常,但结合的SelectedItem的AllCategories是没有的。 ViewBase实现INotifyPropertyChanged。

当我在C#中的视图中更改类别的值时,下拉列表中没有任何反应。

我哪里错了?

UPDATE

按要求评论,这里是我把我的值的代码:

private void ctlBooking_PricesAndFees_AdditionalCostEditing(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     AdditionalCostEventArgs args = e as AdditionalCostEventArgs; 
     AdditionalCostView costToEdit = args.AdditionalCost; 
     AdditionalCostView tempCost = args.AdditionalCost.Clone() as AdditionalCostView; 
     // .. 
    } 
    // .. 
} 

我知道你在想什么,因为我认为同样的事情。 Clone()不是复制值或引发事件,但它是。我在克隆之后慢慢写了它来显式设置这些值,但仍然无效。

中号

+1

您可能在“SelectedValuePath”和“SelectedItem”之间存在冲突。你有没有尝试删除“SelectedValuePath”? – BradleyDotNET 2015-01-15 18:35:29

+0

另一方面,你是否真的*变成列表中的一个项目?或者这些属性匹配? – BradleyDotNET 2015-01-15 18:36:08

+0

您是否在输出窗口中看到任何绑定错误?你在'AllCategories'列表中设置了Category Category表单对象吗? – 2015-01-15 18:38:06

回答

0

你可以用这个XAML尝试(不要忘记申报您的数据):

<UserControl.DataContext> <!--<Window.DataContext>--> 
    <data:AdditionalCostView /> 
</UserControl.DataContext> <!--</Window.DataContext>-->  

<ComboBox Grid.Row="0" Grid.Column="1" 
     DisplayMemberPath="Value" SelectedValuePath="ID" 
     ItemsSource="{Binding AllCategories, Mode=TwoWay}" SelectedValue="{Binding Category.ID, Mode=TwoWay" /> 

应用您ValidationRules在你的模型不是在你的UI。搜索关于DataAnnotations:P

+0

我在哪里把?无论我放在哪里,都会收到错误信息。 – serlingpa 2015-01-15 19:18:27

+0

@serlingpa如果您使用UserControl,则放置UserControl,如果您在那里使用Window put Window。 :) – 2015-01-15 19:24:01