1

我有一个可重用的用户控件,用于使用带有 DependencyProperty SelectedCulture 的组合框选择语言。然后,我使用包含 UserViewModel 集合的 UsersViewModel 在 DataGrid 中显示用户列表的另一个控件。一列是包含语言选择控件的 DataGridTemplateColumn。我将属性 SelectedCulture 绑定到 UserViewModel 的属性,但除非 UpdateSourceTrigger 设置为 PropertyChanged,否则绑定不会更新 UserViewModel 的值。

为什么不?不应该是 PropertyChanged 默认值吗?

语言选择视图:

<UserControl x:Class="MyControls.LanguageSelectView" ... >
...
<ComboBox 
        ItemsSource="{Binding ViewModel.AvailableCultures, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:LanguageSelectView}}}"
        SelectedItem="{Binding SelectedCulture, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:LanguageSelectView}}}"
        >
    <ComboBox.ItemTemplate>
    ...
    </ComboBox.ItemTemplate>
</ComboBox>
</UserControl>

后面的代码:

public static readonly DependencyProperty SelectedCultureProperty = DependencyProperty.Register(nameof(SelectedCulture), typeof(CultureInfo),
        typeof(LanguageSelectView), new FrameworkPropertyMetadata(null) {BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged});

public CultureInfo SelectedCulture
{
    get { return (CultureInfo) GetValue(SelectedCultureProperty); }
    set { SetValue(SelectedCultureProperty, value); }
}

[Import]
public LanguageSelectViewModel ViewModel { get; set; }

用户视图:

...
<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False" Name="DataGrid" SelectionChanged="DataGrid_OnSelectionChanged">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="{wpf:Localize PrefferedLanguage}">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <localization:LanguageSelectView SelectedCulture="{Binding SelectedCulture}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
...

用户视图模型:

public class UserViewModel
{
    ...

    public CultureInfo SelectedCulture
    {
        get { <Getter> }
        set { <Setter> <-- It's not getting called! }
    }
}

当我使用 UpdateSourceTrigger=PropertyChanged 更新绑定时,一切都按预期工作。我检查了语言控件是否正在使用 PropertyChangedCallback 更新 DependencyProperty,并且它工作没有问题,所以看起来像是在用户视图一侧的绑定问题。

谢谢!

4

0 回答 0