从一个项目到另一个项目时,我正在丢失所选值。我的combox框是这样的:
<local:ComboBoxEx x:Name="MYCB"
ItemsSource="{Binding Committente}"
SelectedValue="{Binding CommittenteSelected, Mode=TwoWay}"
SelectionChanged="committente_SelectionChanged"
/>
Committente来自ViewModel:
private ObservableCollection<CommittenteV> _Committente;
public ObservableCollection<CommittenteV> Committente
{
get { return _Committente; }
set
{
_Committente = value;
RaisePropertyChanged("Committente");
}
}
在我的viewmodel的构造函数中,我得到了这样的集合:
Committente = ObservableCollectionConverter.GetObservableCollection<CommittenteV>(Service.getList);
Committente.Insert(0, null);
我添加一个空项目,以便能够拥有一个象征“所有项目”的项目
我的问题是从“真实”项目到这个空项目,我不会让CommittenteSelected等于null,而是选择先前项目的值。
如果这不起作用,我怎么能正确地实现这个“所有项目”功能来提供我的过滤器的组合框?
感谢您的帮助,
答案 0 :(得分:1)
不是将此设置为null,而是可以向CommittenteV添加一个静态CommittenteV,它返回CommittenteV的“Unspecified / All”实例。类似于:
public static CommittenteV AllCommittente = new CommittenteV { Id = SomeUniqueValue };
然后检查此而不是null。当您将其添加到列表中时:
Committente.Insert(0, CommittenteV.AllCommittente);
也许给“AllCommittente”一个唯一的ID,永远不会被任何“真正的”委员会使用?它还允许您为此AllCommittente条目创建特定的显示标签(如果您有一个用于组合框中显示值的属性)。
答案 1 :(得分:0)
您还可以创建CommittenteV对象的子对象,这样当您检查选择了哪个对象时,您可以使用'is'运算符。
public class AllCommittenteV : CommittenteV, IRepresentAll {}
Committente.Insert(0, new AllCommittenteV());
if (SelectedItem is typeof(AllCommittenteV))
// Use All
else
// Use One
这为您打开了一扇门,让您可以创建一个可以注入托管VM的Processor类。将处理器类抛入SelectionChanged方法,您可以通过简单地更改注入的Precessor来更改类的整个行为。
使用该界面,您可以在任何时候表明此对象的合同,将该对象视为已选中。