WPF组合框没有绑定

时间:2017-01-26 14:40:02

标签: c# wpf xaml combobox

我有一个完全没有约束力的组合框。当应用程序运行时,不会填充任何内容。数据来自linq到sql类,然后我将其滚动到自定义对象列表中。我可以确认此列表已填充并在适当的时间,因此它必须是绑定的问题。我怀疑数据模板可能是要走的路,但实际上我不确定如何应用这种情况。

自定义对象(模型)

namespace IhsDataSync.Models.Config
{
    public class StoredActionsModel : BaseModel
    {
        private int _storedActionID;

        public int StoredActionID
        {
            get { return _storedActionID; }
            set { _storedActionID = value; OnPropertyChanged("StoredActionID"); }
        }

        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; OnPropertyChanged("Name"); }
        }

        private string _text;

        public string Text
        {
            get { return _text; }
            set { _text = value; OnPropertyChanged("Text"); }
        }

        private bool _selected;

        public bool Selected
        {
            get { return _selected; }
            set { _selected = value; OnPropertyChanged("Selected"); }
        }



    }
}

查看模型

public static List<StoredActionsModel> StoredActionsList = ActionLinq.buildStoredActions(); // Grabs list from data access layer

private List<StoredActionsModel> _storedActions = StoredActionsList;

    public List<StoredActionsModel> StoredActions
    {

        get { return _storedActions; }
        set {
            if (value != _storedActions)
            {
                _storedActions = value; OnPropertyChanged("StoredActions"); }
            }

    }

buildStoredActions()

public List<StoredActionsModel> buildStoredActions()
{
    List<StoredActionsModel> storedActions = new List<StoredActionsModel>();

    var sa = getStoredActions();

    foreach (var a in sa)
    {
        bool selected = false;
        if(a.Name == "Default Label"){
            selected = true;
        }

        storedActions.Add(new StoredActionsModel { StoredActionID = a.StoredActionID, Name = a.Name, Text = a.Text, Selected = selected });
    }

    return storedActions;
}

XAML

<ComboBox DockPanel.Dock="Top" Background="White" FontWeight="Bold" ItemsSource="{Binding Path= StoredActions.Text}" SelectedIndex="0">

这里我已经告诉它使用所选的第一个项目。这是为了测试我的初始绑定是否有效。我们知道它并不是。

最终我希望所选项目由我在被调用的StoredActions上的bool属性确定,我希望至少使用默认选定项目。

有人可以告诉我为什么在这个例子中我的组合框中没有填充任何内容?此外,有人可以帮助我利用我选择的项目的选定属性?这是数据模板的来源吗?

P.S。 wWPF和c#相当新,所以我可能需要6年的解释。

1 个答案:

答案 0 :(得分:2)

StoredActionsList。它没有Text属性。如果是,它可能是一个字符串,你将使用该字符串中的字符填充你的组合框。不是你想要的。

您想对StoredActions使用ItemsSource,所以就这样做吧。

我猜你的意图是&#34;显示StoredActions&#34;的文本属性。如果要显示每个存储操作的Text属性,请将DisplayMemberPath属性设置为"Text"。然后组合框将获取每个存储操作的Text属性,并将其用于显示文本。

<ComboBox 
    DisplayMemberPath="Text"
    ItemsSource="{Binding StoredActions}" 

    DockPanel.Dock="Top" 
    Background="White" 
    FontWeight="Bold" 
    SelectedIndex="0">

如果这仍然不起作用,我们必须查看您如何设置视图DataContext

现在,如果您想对选择做任何事情,请按照正确的MVVM方式进行处理。将此属性添加到您的viewmodel:

    private StoredActionsModel _selectedStoredAction;
    public StoredActionsModel SelectedStoredAction
    {
        get { return _selectedStoredAction; }
        set
        {
            if (value != _selectedStoredAction)
            {
                _selectedStoredAction = value; OnPropertyChanged("SelectedStoredAction");
            }
        }
    }

在XAML中添加一个绑定,如下所示:

<ComboBox 
    DisplayMemberPath="Text"
    ItemsSource="{Binding StoredActions}" 
    SelectedItem="{Binding SelectedStoredAction}"

    DockPanel.Dock="Top" 
    Background="White" 
    FontWeight="Bold" 
    SelectedIndex="0">

当用户选择组合中的项目时,该项目将分配给SelectedStoredAction属性。您可以向该属性上的setter添加其他代码,也可以在视图中将其他控件属性绑定到该属性。

也许这样:

private StoredActionsModel _selectedStoredAction;
public StoredActionsModel SelectedStoredAction
{
    get { return _selectedStoredAction; }
    set
    {
        if (value != _selectedStoredAction)
        {
            //  Unset Selected on old value, if there was one
            if (_selectedStoredAction != null)
            {
                _selectedStoredAction.Selected = false;
            }
            _selectedStoredAction = value;
            //  Set Selected on new value, if there is one
            if (_selectedStoredAction != null)
            {
                _selectedStoredAction.Selected = true;
            }
            OnPropertyChanged("SelectedStoredAction");
        }
    }
}