来自父控件

时间:2018-01-15 23:13:19

标签: wpf xaml combobox parent-child collectionviewsource

在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;箭头键每次都留空。

我做错了什么,拜托?感谢...

1 个答案:

答案 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}" />

我的控件的每个实例现在都以相同的顺序具有相同的前缀选项集。耶。