如何让AutoCompleteBox在初始加载时显示文本?

时间:2014-11-12 14:03:32

标签: c# wpf xaml autocompletebox

Autocompletebox工作得很好,只是当我最初加载数据时,text属性没有更新。它的效果很好。

这是我的xaml:

<Controls:AutoCompleteBox x:Name="CustomerNumber" Margin="5"
                        DockPanel.Dock="Top"
                        FilterMode="None" 
                        Populating="CustomerNumber_Populating"

                        Text="{Binding Model.SelectedFCust.CustId}"
                        SelectedItem="{Binding Model.SelectedFCust, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        ItemsSource="{Binding Model.FCusts}"
                        ValueMemberPath="CustId"
                        IsTextCompletionEnabled="True"
                        MaxDropDownHeight="110">
    <Controls:AutoCompleteBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding CustId}"/>
                <Run Text=" - "/>
                <Run Text="{Binding Name}"/>
            </TextBlock>
        </DataTemplate>
    </Controls:AutoCompleteBox.ItemTemplate>
</Controls:AutoCompleteBox>

我将Model.SelectedFCust设置为有效值。但是自动完成框在UI中没有显示任何文本。我能错过什么?

fyi,我也试过没有文本绑定,使文本绑定TwoWay,这些都不起作用。

以下是我设置初始值的代码:

public void LoadId(int id)
{
    this.Forecast = _proxy.Load(id).ToReceptacle();
    this.FilterCustomer("");
    this.SelectedFCust = this.FCusts.FirstOrDefault(fc => fc.CustId == this.Forecast.CustomerNumber);
    this.IsDirty = false;
}

_proxy是一个挂钩到wcf服务并从数据库引入数据的对象。容器只是一个以对inotifypropertychanged逻辑变得和蔼可亲的方式表示数据的类。

我的商品来源和所选商品代码......

public ObservableCollection<FilteredCustomer> FCusts
{
    get { return _FCusts; }
    set
    {
        if (_FCusts == value) return;

        _FCusts = value;
        OnPropertyChanged("FCusts");
    }
}
private ObservableCollection<FilteredCustomer> _FCusts;

public FilteredCustomer SelectedFCust
{
    get { return _SelectedFCust; }
    set
    {
        if (_SelectedFCust == value) return;

        _SelectedFCust = value;

        if (value != null)
            this.Forecast.CustomerNumber = value.CustId;
        else
            this.Forecast.CustomerNumber = "";

        OnPropertyChanged("SelectedFCust");
    }
}
private FilteredCustomer _SelectedFCust = null;    

更新:

通过一系列的试验和错误,我决定使用这个代码,它的工作原理。我只是挂钩了selectionchanged事件。

private void CustomerNumber_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (vm.Model.IsDataLoaded && vm.Model.SelectedFCust != null)
        (sender as AutoCompleteBox).Text = vm.Model.SelectedFCust.CustId;
    else
        (sender as AutoCompleteBox).Text = "";
}

我对这个解决方案并不满意所以问题仍然是关于盒子无法正常工作的问题。

我注意到文本更改事件在加载发生后被触发,但是对于我的生活来说无法弄清楚是什么在改变它。当用户界面初始化时,肯定会有一些不可思议的事情发生。

0 个答案:

没有答案