我有一个简单的例子,我想从输入命令填充我的列表框值,该命令限制为文本框
我的 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
位于构造函数中时填充。另外如何在开火之前检查文本框是否为空?
答案 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;
}
}