我有一个Datagrid,双击所选行后,将启动一个编辑屏幕。 在此编辑屏幕上,有组合框,其值绑定到网格中的选定行。 有时,组合框中没有分配给组合框的值,因此组合框中的显示为空,但该值不为空。 如果itemsource集合中不存在该值,如何更新所选项目的值为null。
在上面的场景中,由于第二个屏幕绑定到第一个屏幕上的Selected项目,City的SelectedValue为“洛杉矶”,显示为空。 但由于集合中不存在“洛杉矶”,因此SelectedValue应为null。
答案 0 :(得分:1)
解决方案是将组合框的 ItemsSource 设置为列表(例如:“DeviceNameList”),并将此组合框的 SelectedItem 设置为与之匹配的变量列表中的元素类型(SelectedDeviceName)。
现在,当您加载编辑屏幕时,它会将列表绑定到组合框并显示您设置的变量。
您必须编写一些代码来检查所选项目是否出现在列表中,如果不是,您可以将值设置为零。
示例:强>
XAML代码:
<ComboBox ItemsSource="{Binding Path=DeviceNameList}" SelectedItem="{Binding Path=SelectedDeviceName}" />
设置selectedItem的代码:
/// <summary>
/// Gets or sets SelectedDeviceName.
/// </summary>
public ObservableCollection<string> DeviceNameList
{
get
{
return mDeviceNameList;
}
set
{
mDeviceNameList = value;
}
}
/// <summary>
/// Gets or sets SelectedDeviceName.
/// </summary>
public string SelectedDeviceName
{
get
{
return mSelectedDeviceName;
}
set
{
mSelectedDeviceName = value;
NotifyPropertyChanged("SelectedDeviceName");
}
}
/// <summary>
/// Event PropertyChanged
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Function NotifyPropertyChanged
/// </summary>
/// <param name="property">
/// The property.
/// </param>
private void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
答案 1 :(得分:0)
转换器用于转换绑定中的数据 达到预期的效果。 (允许在源和目标之间匹配不兼容的类型。)
关于组合框和项目源之间使用的转换器的类似问题在这里:
Use converter on bound items in combobox
你可以在这里阅读更多的转换器:
http://wpftutorial.net/ValueConverters.html
在这种情况下,转换器应放在组合的selectedItem属性上。
修改强>
我玩了一些代码示例,并在组合框中注册了选择更改事件。仅当选择项的源产生对组合框有效的选择时,才会触发此事件。 所以现在我回到原来的建议应该有用: 在转换器中,根据组合框项目的所有值列表检查传入值。 如果它不存在,转换器需要让组合知道它应该将其选定项设置为null。虽然我确信有更简单而优雅的方法(我不是WPF专家),但这应该可以解决问题。
如何将转换器与控件挂钩的另一个方法是使用多重绑定:
Can a WPF converter access the control to which it is bound?