![](/img/trans.png)
[英]WPF - MVVM - C# Cannot set SelectedItem of combobox after ItemsSource changes
[英]How to Make C# WPF ComboBox ItemsSource Works with CodeBehind and MVVM IDataErrorInfo
我在XAML ClienWindow.xaml中有这个ComboBox
当我使用Mode=TwoWay
将此ItemsSource绑定到ClientGenderSource后面的代码时,
其无效(无显示),但验证错误有效(IDataErrorInfo),
但是,当我使用Mode=OneWay
或Mode=OneWayToSource
显示男性,女性和验证Mode=OneWayToSource
其工作原理是什么?
<ComboBox
x:Name="ClientGenderField"
Grid.Row="2"
Grid.Column="1"
Width="320"
HorizontalAlignment="Left"
VerticalAlignment="Center"
materialDesign:HintAssist.Hint="Client Gender"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding ClientGender, Mode=TwoWay, ValidatesOnDataErrors=True,
UpdateSourceTrigger=PropertyChanged,
NotifyOnValidationError=true}"
SelectedItem="{Binding EditClient.ClientGender}"
Style="{StaticResource MaterialDesignFloatingHintComboBox}" />
然后在隐藏的代码中: ClienWindow.xaml.cs
string[] ClientGenderSource = new string[] { "Male", "Female", "Other" };
ClientGenderField.ItemsSource = ClientGenderSource;
然后在ClientViewModel.cs中,我具有ClientGender属性:
// ClientGender Property
private string _ClientGender;
public string ClientGender
{
get
{
return _ClientGender;
}
set
{
if (_ClientGender != value)
{
_ClientGender = value;
EditClient.ClientGender = _ClientGender;
NotifyPropertyChanged("ClientGender");
}
}
}
ViewModel CTOR:
public ClientViewModel(Client Client)
{
ClientGender = EditClient.ClientGender;
}
我不知道你绑定的是什么EditClient.ClientGender属性,所以
你能看到这个用于EditClient.ClientGender Concept的仓库:): https : //github.com/SavchenkoDmitry/MVVMBookCRUD
我无法运行重新创建您的代码。 我刚刚创建了一个组合框,其中填充了给定的性别,并且在我的位置可以正常工作。 我没有在后面的代码中使用任何代码。
1)Xaml ..
<UserControl x:Class="GateApplication.Views.Payment"
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:GateApplication.Views"
xmlns:vm="clr-namespace:GateApplication.ViewModels"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="710" Margin="10,10,10,10">
<Grid>
<Grid.DataContext>
<vm:PaymentViewModel></vm:PaymentViewModel>
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<ComboBox
Grid.Row="2"
Grid.Column="1"
Width="320"
HorizontalAlignment="Left"
VerticalAlignment="Center"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding gendermappings,
UpdateSourceTrigger=PropertyChanged,
NotifyOnValidationError=true}"
SelectedItem="{Binding GenderName, Mode=TwoWay}" DisplayMemberPath="GenderName"
/>
</Grid>
</UserControl>
2)ViewModel ...
public class PaymentViewModel : ViewModelBase
{
public PaymentViewModel()
{
LoadClientGender();
}
private ObservableCollection<gender> _gendermappings = new ObservableCollection<gender>();
public ObservableCollection<gender> gendermappings
{
get { return _gendermappings; }
set
{
_gendermappings = value;
OnPropertyChanged("gendermappings");
}
}
private void LoadClientGender()
{
List<gender> genders = new List<gender>();
genders.Add(new gender()
{
GenderName = "Male",
});
genders.Add(new gender()
{
GenderName = "Female",
});
genders.Add(new gender()
{
GenderName = "Other",
});
genders.ForEach(_gendermappings.Add);
}
}
3)型号
public class gender:Base
{
private String _GenderName = String.Empty;
public String GenderName
{
get { return _GenderName; }
set
{
if (_GenderName != value)
{
_GenderName = value;
OnPropertyChanged("GenderName");
}
}
}
}
希望对您有帮助!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.