Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-绑定到用户控件';s依赖项属性不为';如果没有UpdateSourceRigger,则无法正常工作_Wpf_Binding_Dependency Properties_Propertychanged_Updatesourcetrigger - Fatal编程技术网

WPF-绑定到用户控件';s依赖项属性不为';如果没有UpdateSourceRigger,则无法正常工作

WPF-绑定到用户控件';s依赖项属性不为';如果没有UpdateSourceRigger,则无法正常工作,wpf,binding,dependency-properties,propertychanged,updatesourcetrigger,Wpf,Binding,Dependency Properties,Propertychanged,Updatesourcetrigger,我有一个可重用的UserControl,用于使用combobox和DependencyProperty SelectedCulture选择语言。然后,我有另一个控件,其中的用户列表使用UsersViewModel显示在数据网格中,UsersViewModel包含UserViewModel的集合。其中一列是包含语言选择控件的DataGridTemplateColumn。我将属性SelectedCulture绑定到UserViewModel的属性,但是绑定不会更新UserViewModel的值,除非

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

为什么不呢?不应该是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>
用户视图:

...
<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>
...
。。。
...
UserViewModel:

public class UserViewModel
{
    ...

    public CultureInfo SelectedCulture
    {
        get { <Getter> }
        set { <Setter> <-- It's not getting called! }
    }
}
public类UserViewModel
{
...
公共文化信息选择文化
{
获取{}

设置{默认情况下,它只会在控件失去焦点时更新。通过将
UpdateSourceTrigger
更改为
PropertyChanged
,每次更改控件时都会强制它更新。即使控件失去焦点,值也不会更新(我单击组合框,切换值,然后单击其他控件)。如果您看到依赖项属性注册,我会将DefaultUpdateSourceTracger设置为PropertyChanged,这将被忽略。您是否尝试过改用
INotifyPropertyChanged
?这就是我在这种情况下的选择。我尝试将INotifyPropertyChanged添加到语言SelectView中,并在更改dependency属性,但它仍然不起作用:/n不,只需跳过DP并仅实现INPC,并在setter中引发事件。默认情况下,它仅在控件失去焦点时更新。通过将
UpdateSourceTrigger
更改为
PropertyChanged
,每次更改控件时都会强制更新它。即使控件失去焦点,值未更新(我单击组合框,切换值并单击其他控件)。如果您看到依赖项属性注册,我会将DefaultUpdateSourceTracger设置为PropertyChanged,这将被忽略。您是否尝试过改用
INotifyPropertyChanged
?这就是我在这种情况下的选择。我尝试将INotifyPropertyChanged添加到语言SelectView中,并在更改dependency属性,但它仍然不起作用:/n不,只需跳过DP并仅实现INPC,然后在setter中引发事件。
public class UserViewModel
{
    ...

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