双向绑定在WPF中不起作用

时间:2015-01-15 18:33:35

标签: c# wpf xaml data-binding

我有一个WPF应用程序,其中包含多个带有大量控件的对话框。我有一个下拉列表,没有从C#绑定到XAML。另一种方式可以正常工作。

这是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>

AllCategories绑定工作正常,但SelectedItem绑定不正常。 ViewBase实现了INotifyPropertyChanged。

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

我哪里错了?

更新

根据评论请求,这是我设置我的值的代码:

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 个答案:

答案 0 :(得分: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