我是MVVM模式的新手,对于何时使用Code Behind有点困惑.我现在有一个非常简单的表单,包括一个TextBox和一个DataGrid.我想要的是能够让DataGrid根据TextBox更改其选定的项目.
我在Code Behind中完成了这项工作,使用以下代码可以正常工作:
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
for (int i = 0; i < dataGrid1.Items.Count; i++)
{
string cellContent = dtReferral.Rows[i][0].ToString();
try
{
if (cellContent != null && cellContent.Substring(0, textBox1.Text.Length).Equals(textBox1.Text))
{
object item = dataGrid1.Items[i];
dataGrid1.SelectedItem = item;
dataGrid1.ScrollIntoView(item);
//row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
break;
}
}
catch { }
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我只想突出显示Datagrid中以文本框中的文本开头的项目,并允许用户按下按钮来编辑所选项目.
在Code Behind文件中有这个逻辑是否可以?或者我需要通过某种绑定来做到这一点?如果我应该通过带有绑定的视图模型执行此操作,任何方向都将受到赞赏.谢谢.
我正在使用MVVM-Light Framework开发WPF数据库应用程序。我正在使用SimpleIOC注入我的数据服务,并且我的ViewModels已从XAML文件连接到视图。但是,在打开新的视图模型时,我通常还需要将另一个对象传递给视图模型(可以说我传递的是CarId的整数,以便可以从数据库中获取实际的Car)。
现在,在InitializeComponent()之后,我通过在View上使用Messenger来传递它。然后,这被视图模型捕获。这目前确实有效,但是有一些挫折。
首先,直到调用视图模型的构造函数之后,才会发送消息。可以说我在ViewModel中有一个ThisCar对象属性,而我有一些辅助属性,例如一个名为Brand的字符串,它返回ThisCar.Brand。
public const string ThisPersonPropertyName = "ThisCar";
private Model.Car _thisCar;
public Model.Car ThisCar
{
get
{
return _thisCar;
}
set
{
if (_thisCar== value)
{
return;
}
RaisePropertyChanging(ThisCarPropertyName);
_thisCar= value;
RaisePropertyChanged(ThisCarPropertyName);
}
}
public const string BrandPropertyName = "Brand";
public string Brand
{
get
{
return ThisCar.Brand;
}
set
{
if (ThisCar.Brand == value)
{
return;
}
RaisePropertyChanging(BrandPropertyName);
ThisCar.Brand = value;
RaisePropertyChanged(BrandPropertyName);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当构造函数被调用时,我必须像这样在视图模型构造函数中初始化ThisCar,否则在创建ViewModel时,在ThisCar.Brand上会出现null错误。
ThisCar = new CarObject();
Run Code Online (Sandbox Code Playgroud)
然后,在将其初始化为空对象之后,将调用Message,然后我将基于Car ID从数据库中提取真正的Car。
ThisCar = webService.GetCar(carId);
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,品牌属性不会得到更新,因为没有什么调用该品牌的OnPropertyChanged。
我有两种解决方法,但对我来说,它们更像是骇客。首先是手动为需要更新的任何属性调用OnPropertyChanged。其次是我删除所有小的属性,并将所有内容直接绑定到ThisCar属性(这意味着我必须在模型中实现INotifyPropertyChanged)。
请让我知道我是否只是很挑剔,或者是否有更好的方法可以做到这一点。我的工作方式可行,但只是不适合我。谢谢。
我在MVVM上相对较新,并遇到了一个问题.我们正在使用MVVM-Light框架在WPF中编写数据库应用程序.程序状态的规范我们必须能够立即打开ClaimView的多个实例.
要打开新窗口,我们将从ViewModel发送一条消息,该消息将在View中捕获,并打开新窗口.我们使用枚举令牌来识别正确的收件人以获取请求.
现在,如果我有两个ClaimView实例同时打开,并且我调用Messanger,它会打开两个相同的窗口,因为两个视图都在接收消息.
我们尝试在单独的线程上运行ViewModel的每个实例,并通过输出ManagedThreadId进行验证,并且两个实例仍然收到消息.
我们也注册了注册消息,因此这不是问题.
任何帮助,将不胜感激.