Как мне вставить запись MVVM через WCF
Я новичок в MVVM Pattern (с использованием Galasoft MVVM Light). Я создал тестовый проект, в котором я хочу получить некоторые записи из базы данных через WCF. Это работает нормально, но мне не удалось вставить новую запись из View; Вот мой код:
База данных
Имя таблицы: TestUser (Имя, Фамилия)
WCF (NWCustomer)
Два метода
Public List<TestUser> GetAllUsers() [“LINQ2SQL Operation”]
Public bool AddUser(TestUser testuser)
Public bool AddUser(TestUser testuser)
{
try
{
using (DBDataContext db = new DBDataContext())
{
TestUser test = new TestUser()
{
FirstName = testuser.FirstName,
LastName = testuser.LastName
};
db.TestUser.InsertOnSubmit(test);
db.SubmitChanges();
}
}
catch (Exception ex)
{
return false;
}
return true;
}
Проект Silverlight
МОДЕЛЬ состоит
ITestUserService.cs
TestUserService.cs
public void AddTestTable(TestTableViewModel testuser, Action<bool> callback)
{
NWCustomerClient client = new NWCustomerClient("BasicHttpBinding_NWCustomer");
client.AddTestUserCompleted += (s, e) =>
{
var userCallback = e.UserState as Action<bool>;
if (userCallback == null)
{
return;
}
if (e.Error == null)
{
userCallback(e.Result);
return;
}
userCallback(false);
};
client.AddTestUserAsync(testuser.Model);
}
ViewModel
TestUserViewModel
public TestUser User
{
get;
private set;
}
public const string DirtyVisibilityPropertyName = "DirtyVisibility";
private Visibility _dirty = Visibility.Collapsed;
public Visibility DirtyVisibility
{
get
{
return _dirty;
}
set
{
if (_dirty == value)
{
return;
}
_dirty = value;
RaisePropertyChanged(DirtyVisibilityPropertyName);
}
}
public TestUserViewModel (TestUser user)
{
User = user;
user.PropertyChanged += (s, e) =>
{
DirtyVisibility = Visibility.Visible;
};
}
MainViewModel
public ObservableCollection<TestUserViewModel> TestTables
{
get;
private set;
}
public const string ErrorMessagePropertyName = "ErrorMessage";
private string _errorMessage = string.Empty;
public string ErrorMessage
{
get
{
return _errorMessage;
}
set
{
if (_errorMessage == value)
{
return;
}
_errorMessage = value;
RaisePropertyChanged(ErrorMessagePropertyName);
}
}
private ITestUserService _service;
public RelayCommand< TestUserViewModel> AddTestUserRecord
{
get;
private set;
}
public MainTestTableViewModel (ICustomerService service)
{
_service = service;
TestTables = new ObservableCollection<TestTableViewModel>();
service.GetAllTestTable(HandleResult);
}
private void HandleResult(IEnumerable<TestTable> result, Exception ex)
{
TestTables.Clear();
if (ex != null)
{
//Error
return;
}
if (result == null)
{
return;
}
foreach (var test in result)
{
var table = new TestTableViewModel(test);
TestTables.Add(table);
}
}
XAML
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBox Text="FirstName" />
<TextBox Text="LastName" />
<Button Content="Add Record" Command="{Binding AddTestUserRecord}" />
</StackPanel>
</Grid>
Я хочу добавить записи в TestTable (таблица базы данных). Как мне вставить запись? В XAML присутствует два текстовых поля и кнопка управления.
Благодарю вас.
DG
2 ответа
Сначала измените ваш XML. Как многие гоблины сказали:= Вам нужно привязать свойство Text ваших текстовых полей к строковым свойствам на вашей ViewModel, или вы должны выглядеть так
<Grid x:Name="LayoutRoot"> <StackPanel
<TextBox Text="{Binding FirstName,Mode=TwoWay" />
<TextBox Text="{Binding FirstName,Mode=TwoWay" />
<Button Content="Add Record" Command="{Binding AddTestUserRecord}" /> </StackPanel> </Grid>
На ваш взгляд, код модели должен быть таким.
Private _FirstName As String Public Property FirstName() As String
Get
Return _FirstName
End Get
Set(ByVal value As String)
_FirstName = value RaisePropertyChanged(FirstName)
End Set
End Property
Private _LastName As String Public Property LastName() As String
Get
Return _LastName
End Get
Set(ByVal value As String)
_LastName = value RaisePropertyChanged(LastName)
End Set
End Property
Private _AddTestUserRecord As ICommand
Public Property AddTestUserRecord() As ICommand
Get
If _AddTestUserRecordIs Nothing Then
_AddTestUserRecord= New RelayCommand(Nothing, AddressOf AddUser)
End If
Return _rad_Map_Loaded
End Get
Set(ByVal value As ICommand)
_AddTestUserRecord= value
End Set
End Property
Public Sub AddUser()
Try
Using db As New DBDataContext()
Dim test As New TestUser() With { _
Key .FirstName = me.FirstName, _
Key .LastName = me.LastName _
}
db.TestUser.InsertOnSubmit(test)
db.SubmitChanges()
End Using Catch ex As Exception Return False End Try End Sub
Код не очень хорошо отформатирован, а также в vb, но он даст вам четкое представление о том, что вам нужно делать.
Вам необходимо привязать свойство Text ваших текстовых полей к строковым свойствам вашей ViewModel, когда вызывается метод execute вашей команды AddTestUserRecord, просто извлеките свойства и вызовите свою логику, чтобы вставить значения в вашу базу данных.