我正在用mvvm模式做一个简单的项目。它有一个列表,每行有一个文本框和删除按钮,在
但是我们有一个文本框并添加如下按钮:
name1 buttondelete
name2 buttondelete
name3 buttondelete
textbox buttonadd
单击按钮删除该行应删除,单击bottonadd文本框的文本应作为新列表插入
行。
我有三层Sepand.WPFProject.Model,Sepand.WPFProject.ViewModel,Sepand.WPFProject.View;
在模型中我有上下文和存储库和模型(这里我的模型是具有Name& ID属性的Category)类。存储库是这样的:
public class CategoryViewModel
{
ModelRepository<Category> repository = new ModelRepository<Category>();
ObservableCollection<Category> categories = new ObservableCollection<Category>();
Category category = new Category();
public ObservableCollection<Category> GetAll()
{
IQueryable<Category> categoryRepository = repository.GetAll();
foreach (Category Category in categoryRepository)
categories.Add(Category);
return categories;
}
public ObservableCollection<Category> GetAllCategories
{
get { return GetAll(); }
}
public string TxtName
{
get { return category.Name; }
set { category.Name = value; }
}
在viewModel中我有classViewModel类,如下所示:
this.DataContext = new CategoryViewModel();
在我背后的代码中查看
<Window.Resources>
<DataTemplate x:Key="CategoryTemplate">
<Border Width="400" Margin="5" BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="4">
<StackPanel Grid.Row="0" Orientation="Horizontal">
<TextBlock Width="300" Margin="5" Text="{Binding Path=Name}"></TextBlock>
<Button Name="btnDeleteCategory" Width="50" Margin="5" Click="btnDeleteCategory_Click" >-</Button>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
在XAML中我有
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox Grid.Column="0" Grid.Row="0" Name="lstCategory" ItemTemplate="{StaticResource CategoryTemplate}" ItemsSource="{Binding Path=GetAllCategories}"/>
<StackPanel Margin="5" Grid.Column="0" Grid.Row="1" Orientation="Horizontal">
<Label Content="Name : "/>
<TextBox Name="TxtName" Text="{Binding Path=TxtName ,Mode=TwoWay}" Width="260"/>
<Label Width="50"/>
<Button Width="50" Content="+" Name="btnAddCategory" Click="AddCategory_Click" />
</StackPanel>
</Grid>
</Grid>
<TextBlock Width="300" Margin="5" Text="{Binding Path=Name}"></TextBlock>
现在当我运行app时,列表框中填充了数据库中的数据;但我无法编写addbutton和
的代码删除按钮;
谁能告诉我该怎么办?
为什么我无法将列表中的文本框文本绑定到CategoryViewModel类的TxtName属性?
我的意思是
public static string GetDictionaryValue(string key, CultureInfo culture, UmbracoContext context)
{
var dictionaryItem = context.Application.Services.LocalizationService.GetDictionaryItemByKey(key);
if (dictionaryItem != null)
{
var translation = dictionaryItem.Translations.SingleOrDefault(x => x.Language.CultureInfo.Equals(culture));
if (translation != null)
return translation.Value;
}
return key; // if not found, return key
}
当我写Binding Path = TxtName时,列表框不显示数据但是绑定路径=名称
它显示来自数据库的数据
答案 0 :(得分:2)
你的问题有点分散。但我会尝试解决我认为你的问题。
你在后面的代码中说:
this.DataContext = new CategoryViewModel();
但没有别的。
检查按钮无效的原因首先要看的是它正在执行的操作。您的XAML声明它正在使用点击事件:
btnDeleteCategory_Click
那是哪里的?它也不在你的代码隐藏中吗?可能是你没有得到任何东西,这就是为什么你的按钮没有做任何事情 - 你没有指示它做任何事情!
在MVVM中,您应该使用ViewModel中的命令绑定按钮,类似于将数据绑定到ViewModel中的属性的方式。
您需要以下内容:
Command="{Binding Path=DeleteCommand}"
在您看来,并且:
public ICommand DeleteCommand
{
get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); }
}
private void FuncToCall(object context)
{
//this is called when the button is clicked - Delete something
}
private bool FuncToEvaluate(object context)
{
//this is called to evaluate whether FuncToCall can be called
//for example you can return true or false based on some validation logic
return true;
}
绑定到TxtName可能无法正常工作,因为它没有实现/调用PropertyChanged。