MVVM combobox 列表视图中的选定项目绑定
MVVM combobox Selected item binding in listview
我正在尝试在列表视图中绑定组合框。
这是 Xaml:
<UserControl
<UserControl.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="IsSelected" Value="true" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<DockPanel MinWidth="724" Height="387" DataContext="{Binding DeviceDiagnosticsMainVeiwModel}">
<globals:SaveNotificationPopup IsOpen="{Binding IsSaveNotificationPopupOpen}" SaveCommand="{Binding SaveCommand}" CancelCommand="{Binding CloseSaveNotificationPopup}" Placement="Relative" VerticalOffset="300" HorizontalOffset="200" />
<StackPanel>
<Grid Width="250" HorizontalAlignment="Left" Margin="10,10,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="23" />
<RowDefinition Height="Auto" MinHeight="23" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Content="{x:Static ml:MultiLang._2001}" x:Name="ML_0209" />
<Label Grid.Row="1" Content="{x:Static ml:MultiLang._2009}" x:Name="ML_0211" />
<ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Manufacturers}" DisplayMemberPath="WorkingPlace" SelectedValuePath="PersonCode" SelectedValue="{Binding Path=ManufacturerID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Devices}" DisplayMemberPath="Model" SelectedValue="{Binding Path=SelectedDevice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
<ListView DockPanel.Dock="Top" Margin="10,25,10,10" Width="460" ScrollViewer.HorizontalScrollBarVisibility="Hidden" HorizontalAlignment="Left" ItemsSource="{Binding CurrentDeviceDiagnostics}" SelectedItem="{Binding SelectedDeviceDiagnostics}" BorderThickness="1">
<ListView.View>
<GridView>
<GridViewColumn Header="Command" Width="180" x:Name="ML_0007">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding DiagnosticsCommand, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" FontSize="12" Margin="0 5 0 0" Width="165" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="180" x:Name="ML_0010">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding DiagnosticsName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" FontSize="12" Margin="0 5 0 0" Width="165" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Units" Width="100" x:Name="ML_0013">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Units}" DisplayMemberPath="UnitName" SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" VerticalAlignment="Top" Width="85" Margin="0,1,0,0" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<ContentControl DockPanel.Dock="Top" Content="{Binding AddNewCAView}" />
<!-- No Diagnodtics message-->
<globals:NoItemsMessage DockPanel.Dock="Top" Visibility="{Binding NoDiagnosticsVisibility}" HorizontalAlignment="Left" Margin="10" Width="360" Height="40" Message="{x:Static ml:MultiLang._742}" x:Name="ML_0017" />
<!-- delete popup -->
<globals:DeletePopup IsOpen="{Binding IsConfirmDeletePopupOpen}" Message1="{x:Static ml:MultiLang._746}" DeleteCommand="{Binding DeleteCommand}" CancelCommand="{Binding CancelDeleteCommand}" Placement="Center" VerticalOffset="-200" HorizontalOffset="200" x:Name="ML_0018" />
</StackPanel>
</DockPanel>
</UserControl>
停靠面板绑定到:DataContext="{Binding DeviceDiagnosticsMainVeiwModel}"
列表视图绑定是:
ItemsSource="{Binding CurrentDeviceDiagnostics}" SelectedItem="{Binding SelectedDeviceDiagnostics}"
并且 CurrentDeviceDiagnostics 和 SelectedDeviceDiagnostics 都是 DeviceDiagnosticsMainVeiwModel 的成员。
列表视图中的一个文本框(例如)绑定如下:
Text="{Binding DiagnosticsCommand, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
CurrentDeviceDiagnostics 是 DeviceDiagnosticsVeiwModel 的可观察集合,其中包含 DiagnosticsCommand。
并且工作正常(两个文本框)。
复选框绑定如下:
ItemsSource="{Binding Units}" DisplayMemberPath="UnitName" SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
并且 Units 和 DiagnosticsUnit 也是 DeviceDiagnosticsVeiwModel 的成员。
项目来源工作正常,并按照我需要的方式填充。
问题出在所选项目上...尽管 DiagnosticsUnit 具有整数值,但它被初始化为空。
有趣的是,如果我从组合框中选择某些东西,代码会转到 DiagnosticsUnit 属性 到 set 函数,所以我不确定这个问题...
即使我使用 DiagnosticsUnit 将组合框更改为文本框,它也会起作用!
我使用了很多 mvvm 组合框,没有任何绑定问题,但这是我第一次在列表视图中使用组合框...
请帮助我。
谢谢大家!!!
让我们分解一下...你说:
both CurrentDeviceDiagnostics
and SelectedDeviceDiagnostics
are members of DeviceDiagnosticsMainViewModel
.
这是应该的。然后你说:
CurrentDeviceDiagnostics
is an ObservableCollection<DeviceDiagnosticsViewModel>
因此, 中 CellTemplate
中的数据绑定应该指向 DeviceDiagnosticsViewModel
class 中的属性,正如您正确指出的那样。
因此,查看您下面的 ComboBox
代码,我只能想到这行不通的两个可能原因:
<ComboBox ItemsSource="{Binding Units}" DisplayMemberPath="UnitName"
SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="85" Margin="0,1,0,0" />
一个建议是改用 ComboBox.SelectedItem
属性 并将数据绑定到与 Units
集合类型相同的实例...但是,如果是只是 int
的集合,则此步骤无济于事。唯一的另一件事是确保您已在 DeviceDiagnosticsViewModel
class.
中正确实现 INotifyPropertyChanged
接口
O.K
我终于找到问题了!
这不是一个有约束力的问题。
这很愚蠢。
我有这个代码
public void GetItems()
{
_devicesDiagnostics = new ObservableCollection<DeviceDiagnosticsVeiwModel>(
(来自 _dal.GetItems() 中的 dd
顺序 dd.DeviceID
select 新 DeviceDiagnosticsVeiwModel(dd)
{
对象状态 = Status.NoChange,
单位 = _manager.UnitRepository.Units<br>
}
) .ToObservableCollection<DeviceDiagnosticsVeiwModel>()
);<br>
}
Units 是视图模型 (DeviceDiagnosticsVeiwModel) 中的一个成员,它实际上是组合框项目源。
在 DeviceDiagnosticsVeiwModel 内部有一个 int 属性,它是 selected 项。它加载不正确。
正确的代码是
public void GetItems()
{
_devicesDiagnostics = new ObservableCollection<DeviceDiagnosticsVeiwModel>(
(from dd in _dal.GetItems()
orderby dd.DeviceID
select new DeviceDiagnosticsVeiwModel(dd)
{
ObjectStatus = Status.NoChange,
Units = new ObservableCollection<UnitViewModel>(this.Units),
}
)
.ToObservableCollection<DeviceDiagnosticsVeiwModel>()
);
}
我必须给每个对象一个 new 列表。成功了。
我正在尝试在列表视图中绑定组合框。 这是 Xaml:
<UserControl
<UserControl.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="IsSelected" Value="true" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<DockPanel MinWidth="724" Height="387" DataContext="{Binding DeviceDiagnosticsMainVeiwModel}">
<globals:SaveNotificationPopup IsOpen="{Binding IsSaveNotificationPopupOpen}" SaveCommand="{Binding SaveCommand}" CancelCommand="{Binding CloseSaveNotificationPopup}" Placement="Relative" VerticalOffset="300" HorizontalOffset="200" />
<StackPanel>
<Grid Width="250" HorizontalAlignment="Left" Margin="10,10,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="23" />
<RowDefinition Height="Auto" MinHeight="23" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Content="{x:Static ml:MultiLang._2001}" x:Name="ML_0209" />
<Label Grid.Row="1" Content="{x:Static ml:MultiLang._2009}" x:Name="ML_0211" />
<ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Manufacturers}" DisplayMemberPath="WorkingPlace" SelectedValuePath="PersonCode" SelectedValue="{Binding Path=ManufacturerID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Devices}" DisplayMemberPath="Model" SelectedValue="{Binding Path=SelectedDevice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
<ListView DockPanel.Dock="Top" Margin="10,25,10,10" Width="460" ScrollViewer.HorizontalScrollBarVisibility="Hidden" HorizontalAlignment="Left" ItemsSource="{Binding CurrentDeviceDiagnostics}" SelectedItem="{Binding SelectedDeviceDiagnostics}" BorderThickness="1">
<ListView.View>
<GridView>
<GridViewColumn Header="Command" Width="180" x:Name="ML_0007">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding DiagnosticsCommand, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" FontSize="12" Margin="0 5 0 0" Width="165" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="180" x:Name="ML_0010">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding DiagnosticsName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" FontSize="12" Margin="0 5 0 0" Width="165" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Units" Width="100" x:Name="ML_0013">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Units}" DisplayMemberPath="UnitName" SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" VerticalAlignment="Top" Width="85" Margin="0,1,0,0" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<ContentControl DockPanel.Dock="Top" Content="{Binding AddNewCAView}" />
<!-- No Diagnodtics message-->
<globals:NoItemsMessage DockPanel.Dock="Top" Visibility="{Binding NoDiagnosticsVisibility}" HorizontalAlignment="Left" Margin="10" Width="360" Height="40" Message="{x:Static ml:MultiLang._742}" x:Name="ML_0017" />
<!-- delete popup -->
<globals:DeletePopup IsOpen="{Binding IsConfirmDeletePopupOpen}" Message1="{x:Static ml:MultiLang._746}" DeleteCommand="{Binding DeleteCommand}" CancelCommand="{Binding CancelDeleteCommand}" Placement="Center" VerticalOffset="-200" HorizontalOffset="200" x:Name="ML_0018" />
</StackPanel>
</DockPanel>
</UserControl>
停靠面板绑定到:DataContext="{Binding DeviceDiagnosticsMainVeiwModel}"
列表视图绑定是:
ItemsSource="{Binding CurrentDeviceDiagnostics}" SelectedItem="{Binding SelectedDeviceDiagnostics}"
并且 CurrentDeviceDiagnostics 和 SelectedDeviceDiagnostics 都是 DeviceDiagnosticsMainVeiwModel 的成员。
列表视图中的一个文本框(例如)绑定如下:
Text="{Binding DiagnosticsCommand, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
CurrentDeviceDiagnostics 是 DeviceDiagnosticsVeiwModel 的可观察集合,其中包含 DiagnosticsCommand。
并且工作正常(两个文本框)。
复选框绑定如下:
ItemsSource="{Binding Units}" DisplayMemberPath="UnitName" SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
并且 Units 和 DiagnosticsUnit 也是 DeviceDiagnosticsVeiwModel 的成员。
项目来源工作正常,并按照我需要的方式填充。 问题出在所选项目上...尽管 DiagnosticsUnit 具有整数值,但它被初始化为空。
有趣的是,如果我从组合框中选择某些东西,代码会转到 DiagnosticsUnit 属性 到 set 函数,所以我不确定这个问题... 即使我使用 DiagnosticsUnit 将组合框更改为文本框,它也会起作用!
我使用了很多 mvvm 组合框,没有任何绑定问题,但这是我第一次在列表视图中使用组合框...
请帮助我。
谢谢大家!!!
让我们分解一下...你说:
both
CurrentDeviceDiagnostics
andSelectedDeviceDiagnostics
are members ofDeviceDiagnosticsMainViewModel
.
这是应该的。然后你说:
CurrentDeviceDiagnostics
is anObservableCollection<DeviceDiagnosticsViewModel>
因此, 中 CellTemplate
中的数据绑定应该指向 DeviceDiagnosticsViewModel
class 中的属性,正如您正确指出的那样。
因此,查看您下面的 ComboBox
代码,我只能想到这行不通的两个可能原因:
<ComboBox ItemsSource="{Binding Units}" DisplayMemberPath="UnitName"
SelectedValuePath="UnitCode" SelectedValue="{Binding DiagnosticsUnit, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="85" Margin="0,1,0,0" />
一个建议是改用 ComboBox.SelectedItem
属性 并将数据绑定到与 Units
集合类型相同的实例...但是,如果是只是 int
的集合,则此步骤无济于事。唯一的另一件事是确保您已在 DeviceDiagnosticsViewModel
class.
INotifyPropertyChanged
接口
O.K 我终于找到问题了! 这不是一个有约束力的问题。 这很愚蠢。 我有这个代码
public void GetItems()
{
_devicesDiagnostics = new ObservableCollection<DeviceDiagnosticsVeiwModel>(
(来自 _dal.GetItems() 中的 dd
顺序 dd.DeviceID
select 新 DeviceDiagnosticsVeiwModel(dd)
{
对象状态 = Status.NoChange,
单位 = _manager.UnitRepository.Units<br>
}
) .ToObservableCollection<DeviceDiagnosticsVeiwModel>()
);<br>
}
Units 是视图模型 (DeviceDiagnosticsVeiwModel) 中的一个成员,它实际上是组合框项目源。 在 DeviceDiagnosticsVeiwModel 内部有一个 int 属性,它是 selected 项。它加载不正确。
正确的代码是
public void GetItems()
{
_devicesDiagnostics = new ObservableCollection<DeviceDiagnosticsVeiwModel>(
(from dd in _dal.GetItems()
orderby dd.DeviceID
select new DeviceDiagnosticsVeiwModel(dd)
{
ObjectStatus = Status.NoChange,
Units = new ObservableCollection<UnitViewModel>(this.Units),
}
)
.ToObservableCollection<DeviceDiagnosticsVeiwModel>()
);
}
我必须给每个对象一个 new 列表。成功了。