在CRM系统上工作,我可能会同时打开多个订单,每个订单都使用相同的选项作为订单号前缀,这是一个字符串。我希望在绑定到自定义UserControl实例的viewmodel类中实例化的所有订单实例都可以查询父控件上的单个CollectionViewSource,因此我只需要一个位置来存储该公共数据。
父控件的XAML包括:
<Window.Resources>
<CollectionViewSource x:Key="vsOrderPrefixes" />
</Window.Resources>
它的代码隐藏加载了CollectionViewSource,其中包含一个元组集合,其中Item1是下拉选项,Item2确定排序顺序:
private void LoadCommonOrderOptions()
{
var vsOrderPrefixes = ((CollectionViewSource)(FindResource("vsOrderPrefixes")));
var prefixes = new ObservableCollection<Tuple<string, int>>(
DataRepository.Instance.GetOptionsByCodeName(Constants.OrderPrefixCodeName));
vsOrderPrefixes.Source = prefixes.OrderBy(pr => pr.Item2);
}
子控件XAML中的ComboBox,其语法部分由另一篇文章提供:
<ComboBox x:Name="cbxOrderPrefix" SelectedValue="{Binding OrderPrefix}"
DataContext="{DynamicResource vsOrderPrefixes}" ItemsSource="{Binding Path=.}"
DisplayMemberPath="Item1" SelectedValuePath="Item1" />
viewmodel的绑定属性没有什么特别之处:
private string _orderPrefix;
public string OrderPrefix
{
get { return _orderPrefix; }
set
{
if (_orderPrefix != value)
{
_orderPrefix = value;
NotifyListeners(); // Fires PropertyChanged event
}
}
}
不确定它是如何重要的,但在其中一个子控件的祖先(&#34; UserControl&#34;在下面的段落中)的函数内,我创建了VM,子控件和一个TabItem孩子会继续。然后我将VM分配给孩子的DataContext,让孩子成为TabItem的内容,然后将TabItem添加到祖先的TabControl中:
var tabb = new TabItem() { Title = orderVM.OrderID };
var uclOrder = new OrderInfo(); // Child control
uclOrder.DataContext = orderVM;
tabb.Content = uclOrder;
tclOrders.Items.Add(tabb);
最后,如果重要的是,子控件不是直接在父控件上,它更像是Parent | TabControl | TabItem | UserControl | TabControl | TabItem | ScrollViewer | TabControl | TabItem |子。
好的: ComboBox实际上填充了检索到的选项,通过显示下拉列表可以观察到。
THE BAD:选择其中一个选项会将ComboBox留空,并且永远不会达到绑定属性集。
THE WEIRD:加载后,ComboBox似乎选择了第一个选项,然后如果你继续按下&#34; down&#34;箭头键,从第二次按下开始,此后每隔三次按下,第一个选项再次出现,并且两者之间是空白。同样,没有设置属性。然后按下&#34; up&#34;箭头键每次都留空。
我做错了什么,拜托?感谢...
答案 0 :(得分:0)
更多的替代路线而不是答案,但我决定选择静态集合成员:
public class OrderVM
{
public static List<String> PrefixOptions { get; set; }
public OrderVM()
{
if (PrefixOptions == null)
{
PrefixOptions = new List<String>();
// .Add calls ensue
}
}
...
}
在XAML中:
<ComboBox x:Name="cbxOrderPrefix" ItemsSource="{Binding PrefixOptions}" SelectedValue="{Binding OrderPrefix}" />
我的控件的每个实例现在都以相同的顺序具有相同的前缀选项集。耶。