Wpf MVVM问题,将组合框绑定到datagrid
我有一种主视图/详细视图。我有一些文本框和一个组合框绑定到数据网格的选定项。我想要的是文本框和组合框,以便在选择行时填充数据网格中的数据。这部分很好用。我遇到的问题是,当我更改组合框的值时,数据网格字段没有更新。我已经实现了INotifyPropertyChanged,但似乎有什么地方出错了。数据网格保存user类型的记录,而相关的组合框包含role类型的记录。用户实体具有RoleID的导航属性。如何确保在更改“详细信息”中的“角色”组合框时更新数据网格 谢谢, RG 这是XAMLWpf MVVM问题,将组合框绑定到datagrid,wpf,mvvm,binding,datagrid,combobox,Wpf,Mvvm,Binding,Datagrid,Combobox,我有一种主视图/详细视图。我有一些文本框和一个组合框绑定到数据网格的选定项。我想要的是文本框和组合框,以便在选择行时填充数据网格中的数据。这部分很好用。我遇到的问题是,当我更改组合框的值时,数据网格字段没有更新。我已经实现了INotifyPropertyChanged,但似乎有什么地方出错了。数据网格保存user类型的记录,而相关的组合框包含role类型的记录。用户实体具有RoleID的导航属性。如何确保在更改“详细信息”中的“角色”组合框时更新数据网格 谢谢, RG 这是XAML <Us
<UserControl x:Class="Compliance.Views.UserAdministrationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Compliance"
xmlns:views="clr-namespace:Compliance.Views"
xmlns:helpers="clr-namespace:Compliance.Helpers"
xmlns:vm="clr-namespace:Compliance.ViewModels"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
d:DesignHeight="1000" d:DesignWidth="800">
<UserControl.Resources>
<helpers:ActiveStatusConverter x:Key="ActiveStatusConverter"/>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="0" Margin="15">
<Label Content="User" Height="25" FontSize="14" HorizontalContentAlignment="Center" />
<Grid HorizontalAlignment="Center" VerticalAlignment="Top" DataContext="{Binding ElementName=usersDG, Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" MinHeight="35" />
</Grid.RowDefinitions>
<telerik:Label Content="User Name: " Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180" >
<TextBox.Text>
<Binding Path="UserName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<telerik:Label Content="First Name: " Grid.Column="2" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
<TextBox Grid.Column="3" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
<TextBox.Text>
<Binding Path="FirstName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<telerik:Label Content="Last Name: " Grid.Column="4" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
<TextBox Grid.Column="5" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
<TextBox.Text>
<Binding Path="LastName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<telerik:Label Content="Email: " Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="1" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
<TextBox.Text>
<Binding Path="Email" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<telerik:Label Content="Active Status: " Grid.Column="2" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
<telerik:RadComboBox x:Name="comBoxActiveStatus" Grid.Column="3" Grid.Row="1" MinHeight="23" MinWidth="180" HorizontalAlignment="Left" VerticalAlignment="Center"
SelectedItem="{Binding Path=ActiveStatus,
Converter={StaticResource ResourceKey=ActiveStatusConverter},
Mode=TwoWay,
ValidatesOnExceptions=True,
NotifyOnValidationError=True,
UpdateSourceTrigger=PropertyChanged}"
EmptyText="Please Set Active Status">
</telerik:RadComboBox>
<telerik:Label Content="Role: " Grid.Column="4" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
<telerik:RadComboBox x:Name="cmbRoles"
Grid.Column="5"
Grid.ColumnSpan="3"
Grid.Row="1"
MinHeight="23"
HorizontalAlignment="Left"
Margin="5"
VerticalAlignment="Center"
MinWidth="180"
ItemsSource="{Binding}"
DisplayMemberPath="RoleName"
SelectedValue="{Binding RoleID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="RoleID"
EmptyText="Please Choose A Role">
<telerik:RadComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</telerik:RadComboBox.ItemsPanel>
</telerik:RadComboBox>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" Content="Save User" Width="100" />
<Button Grid.Column="4" Grid.Row="2" Grid.ColumnSpan="3" Content="Add User" Width="100" />
</Grid>
</StackPanel>
<Border CornerRadius="10" BorderThickness="5" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center">
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Users" Grid.Row="0" Height="25" FontSize="14" HorizontalContentAlignment="Center" />
<telerik:RadGridView x:Name="usersDG" ItemsSource="{Binding Users}" AutoGenerateColumns="False" ShowGroupPanel="False" IsReadOnly="True">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding UserName}" Header="User Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="First Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="Last Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Email}" Header="Email" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Role.RoleName, Mode=TwoWay}" Header="Role Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding ActiveStatus, Converter={StaticResource ActiveStatusConverter}}" Header="Active Status" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</Grid>
</Border>
</Grid>
您的
组合框
绑定看起来很奇怪
您有ItemsSource=“{Binding}”
这表明组合框的DataContext是角色对象的集合,但是您也有SelectedValue=“{Binding RoleID}
,这表明DataContext
包含一个名为RoleID
的属性
此外,您的GridView
绑定到Role.RoleName
,因此我希望您希望将ComboBox.SelectedValue
绑定到Role.RoleId
或者ComboBox.SelectedItem
绑定到属性Role
,如果它们在内存中引用相同的Role
对象
所以我希望您的组合框绑定看起来像
<ComboBox ItemsSource="{Binding Source={x:Static local:StaticLists.RoleList}}"
SelectedValue="{Binding Role.RoleID}" ... />
或者像这样:
<ComboBox ItemsSource="{Binding
RelativeSource={RelativeSource AncestorType={x:Type views:UserAdministrationView}},
Path=DataContext.AvailableRoles}"
SelectedItem="{Binding Role}" ... />
我建议查看您的组合框.DataContext
是什么(我用于调试类似的东西),并再次检查您的绑定是否正确您的组合框
绑定看起来很奇怪
您有ItemsSource=“{Binding}”
这表明组合框的DataContext是角色对象的集合,但是您也有SelectedValue=“{Binding RoleID}
,这表明DataContext
包含一个名为RoleID
的属性
此外,您的GridView
绑定到Role.RoleName
,因此我希望您希望将ComboBox.SelectedValue
绑定到Role.RoleId
或者ComboBox.SelectedItem
绑定到属性Role
,如果它们在内存中引用相同的Role
对象
所以我希望您的组合框绑定看起来像
<ComboBox ItemsSource="{Binding Source={x:Static local:StaticLists.RoleList}}"
SelectedValue="{Binding Role.RoleID}" ... />
或者像这样:
<ComboBox ItemsSource="{Binding
RelativeSource={RelativeSource AncestorType={x:Type views:UserAdministrationView}},
Path=DataContext.AvailableRoles}"
SelectedItem="{Binding Role}" ... />
我建议查看您的组合框.DataContext
是什么(我用于调试类似的东西),并仔细检查您的绑定是否正确某些属性或控件不默认为模式=双向
。我会先检查这是否解决了您的问题。我确实设置了模式双向。如果您发布一些源代码会有所帮助。某些属性或控件不会默认为Mode=TwoWay
。我会先检查这是否解决了你的问题。我有双向模式设置。如果你发布一些源代码会有所帮助。嗨,瑞秋。组合框的ItemsSource绑定到从数据库中提取的角色列表。datagrid绑定到具有RoleID导航属性的ObservableCollection用户。我已将文本框和组合框绑定到datagrid选定项。当我点击datagrid中的一行时,文本框和组合框会相应地改变。更改文本框中的数据会更新datagrid中的行,但更改combobox不会更新datagrid中的角色。这就是我遇到的问题。@user1599271如果没有看到您的确切代码,很难判断问题出在哪里,但是有一些事情需要尝试。首先,如果您的组合框.SelectedValue
绑定到User.RoleId,那么请确保更改User.RoleId
会触发User.Role的PropertyChange
通知,因为这是您的数据网格绑定到的。第二,您可以尝试绑定<代码> COMBOBOX。SelectedItem < /COD>到<代码>用户。角色< /代码>,但是,为了工作,请确保它们指向同一个对象引用,或者重写<代码>角色.UnalSub()/Case>方法,以考虑在IDS中相同的对象。match@user1599271最后,,这可能是Telerik的GridView
控件的一个怪癖(我以前在他们的WPF控件中发现了一些奇怪的怪癖),在Role
上属性没有更新为PropertyChange
通知,而它需要Role.RoleName
的PropertyChange通知。因此,您可以尝试触发User.Role.Role的属性更改通知