无法从Command填充数据

时间:2015-03-05 09:35:59

标签: c# wpf

我有一个简单的例子,我想从输入命令填充我的列表框值,该命令限制为文本框

我的 MainWindow.xaml

 <Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
<Grid>
    <TextBox  HorizontalAlignment="Left" Height="23" Margin="54,32,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120">
        <TextBox.InputBindings>
            <KeyBinding Command="{Binding Path=EnterCommand}" Key="Enter"/>
        </TextBox.InputBindings>
    </TextBox>
    <ListBox ItemsSource="{Binding Path=MyList}" HorizontalAlignment="Left" Height="107" Margin="54,70,0,0" VerticalAlignment="Top" Width="120"/>

</Grid>

VieModel

public class ViewModel:INotifyPropertyChanged
{
    private List<string> _list;
    public IRelayCommand EnterCommand { get; protected set; }
    public ViewModel()
    {
        CreateEnterCommand();

    }

    private void CreateEnterCommand()
    {
        this.EnterCommand = new RelayCommand(EnterCommandExecuted, CanExecuteEnterCommand);
    }

    private void EnterCommandExecuted(object obj)
    {
        FillData();//Pass your Data here
    }

    private bool CanExecuteEnterCommand(object obj)
    {

        return true;
    }

    private void FillData()
    {
        MyList = new List<string>();
        MyList.Add("1");
        MyList.Add("2");
        MyList.Add("3");
        MyList.Add("4");
    }

    public List<string> MyList
    {
        get
        {
            return _list;
        }
        set
        {
            _list = value;

        }

    }

    public event PropertyChangedEventHandler PropertyChanged;
}

列表框未填充,仅在FillData位于构造函数中时填充。另外如何在开火之前检查文本框是否为空?

3 个答案:

答案 0 :(得分:2)

它没有更新的原因是因为没有人告诉视图新数据可用。

如果您使用ObservableCollection代替实现INotifyCollectionChanged的MyList属性,则在添加项目时视图会更新。

您需要更改的唯一方法是创建MyList属性的方式,将其更改为

MyList = new ObservableCollection<string>();

并让属性返回IList(或ObservableCollection)而你应该没问题。

此外,在使用这样的集合时,您应该在构造函数中创建MyList,并使集合只读。这样您就不会意外地将列表分配给新实例,并且不会丢失您可能附加的任何事件。例如,如果您的属性是公共的,另一个类可能会将列表设置为其他类,但由于您不触发属性更改事件,视图仍将绑定到旧列表,因此您添加到列表中的任何项不行。

private readonly ObservableCollection<string> _list;
public ViewModel()
{
    _list = new ObservableCollection<string>();
}

public ObservableCollection<string> MyList
{
    get { return _list; }
}

public void FillData()
{
    // add any items you like to either _list or MyList,
    // because it's an observable collection, there's no
    // need to recreate the list, the view will be notified either way
}

答案 1 :(得分:1)

它不起作用的原因是您的MyList属性设置器未提升PropertyChanged事件。

在您的特定情况下,您可以将MyList设为ObservableCollection<string>而不是List<string>,在构造函数中指定属性一次,然后清除列表并从中添加项目FillData方法。这也意味着您不再需要实施INotifyPropertyChanged

public class ViewModel
{
    public IRelayCommand EnterCommand { get; protected set; }

    public ViewModel()
    {
        this.EnterCommand = new RelayCommand(EnterCommandExecuted, CanExecuteEnterCommand);
        this.MyList = new ObservableCollection<string>();
    }

    private void EnterCommandExecuted(object obj)
    {
        FillData();//Pass your Data here
    }

    private bool CanExecuteEnterCommand(object obj)
    {
        return true;
    }

    private void FillData()
    {
        MyList.Clear();
        MyList.Add("1");
        MyList.Add("2");
        MyList.Add("3");
        MyList.Add("4");
    }

    public ObservableCollection<string> MyList { get; private set; }
}

答案 2 :(得分:0)

您需要在视图模型中进行一些更改。请将MyList的类型更改为ObservableCollection。您也可以从您的集合中激活NotifyCHange事件,但只有在您更改整个MyList实例时才会激活。

public ObservableCollection<string> MyList
    {
        get
        {
            return _list;
        }
        set
        {
            _list = value;

        }

    }