gpt4 book ai didi

wpf - Silverlight 用户控件中的自定义绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 13:45:19 25 4
gpt4 key购买 nike

我在 MVVM Silverlight 应用程序中通过我的 ViewModel 绑定(bind)自定义用户控件时遇到问题。基本控件是一个带有三个文本框的日期输入表单。我正在使用 MVVM 在三个属性中获取文本框数据,然后将其验证为日期。

将以下控件绑定(bind)到 MVVM 对我来说效果很好:

用户控件的 XAML: DateControl.xaml

<UserControl x:Class="DatePicker.DateControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid x:Name="LayoutRoot" Background="White"
HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<TextBox MaxLength="2" TabIndex="0" Style="{StaticResource BirthDDTextBoxStyle}"
Text="{Binding BirthDay,Mode=TwoWay,ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"/>
<TextBlock Style="{StaticResource TextBlockStyle_DateSeperator}"/>
<TextBox MaxLength="2" TabIndex="1" Style="{StaticResource BirthDDTextBoxStyle}" Text="{Binding BirthMonth, Mode=TwoWay,ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"/>
<TextBlock Style="{StaticResource TextBlockStyle_DateSeperator}"/>
<TextBox MaxLength="4" TabIndex="2" Style="{StaticResource BirthYYTextBoxStyle}" Text="{Binding BirthYear, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"/>
<Button Content="Show" Width="100" Height="30" Click="Button_Click"/>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>

DateControlViewModel :

namespace DatePicker
{
public class DatePickerViewModel : EntityViewModel
{
public DatePickerViewModel()
{

}

private DateTime birthDate;
public DateTime BirthDate
{
get
{

return birthDate;
}
set
{
birthDate = value;
}
}
private string birthDay;
public string BirthDay
{
get { return birthDay; }
set
{
birthDay = value;
PropertyChangedHandler("BirthDay");
ValidateBirthDay("BirthDay", value);
}
}

private string birthMonth;
public string BirthMonth
{
get { return birthMonth; }
set
{
birthMonth = value;
PropertyChangedHandler("BirthMonth");
ValidateBirthMonth("BirthMonth", value);
}
}

private string birthYear;
public string BirthYear
{
get { return birthYear; }
set
{
birthYear = value;
PropertyChangedHandler("BirthYear");
ValidateBirthYear("BirthYear", value);
}
}

private void ValidateDOB()
{
ClearErrorFromProperty("BirthDay");
ClearErrorFromProperty("BirthMonth");
ClearErrorFromProperty("BirthYear");
if (string.IsNullOrEmpty(BirthDay))
ValidateBirthDay("BirthDay", BirthDay);
if (string.IsNullOrEmpty(BirthMonth))
ValidateBirthMonth("BirthMonth", BirthMonth);
if (string.IsNullOrEmpty(BirthYear))
ValidateBirthYear("BirthYear", BirthYear);
if (!string.IsNullOrEmpty(BirthDay) && !string.IsNullOrEmpty(BirthMonth) && !string.IsNullOrEmpty(BirthYear))
SetDateOfBirth();
}

private void ValidateBirthDay(string propertyName, string value)
{
ClearErrorFromProperty(propertyName);
if (String.IsNullOrEmpty(value))
AddErrorForProperty(propertyName, "Resources.PatientImport.EmptyDayMessage");
else
if (Common.IsNumber(value))
{
int day = Convert.ToInt32(value);
if (day > 31 || day < 1)
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidDayMessage");
}
else
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidDayMessage");
}

private void ValidateBirthMonth(string propertyName, string value)
{
ClearErrorFromProperty(propertyName);
if (String.IsNullOrEmpty(value))
AddErrorForProperty(propertyName, "Resources.PatientImport.EmptyMonthMessage");
else
if (Common.IsNumber(value))
{
int month = Convert.ToInt32(value);
if (month > 12 || month < 1)
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidMonthMessage");
}
else
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidMonthMessage");
}

private void ValidateBirthYear(string propertyName, string value)
{
ClearErrorFromProperty(propertyName);
if (String.IsNullOrEmpty(value))
AddErrorForProperty(propertyName, "Resources.PatientImport.EmptyYearMessage");
else
if (Common.IsNumber(value))
{
int year = Convert.ToInt32(value);
if (year.ToString().Length > 4 || year.ToString().Length < 4)
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidYearMessage");
}
else
AddErrorForProperty(propertyName, "Resources.PatientImport.InvalidYearMessage");
}

private void SetDateOfBirth()
{
string dateString = BirthDay + "-" + BirthMonth + "-" + BirthYear;
DateTime date;
if (!DateTime.TryParse(dateString.ToString(), out date))
{
ClearErrorFromProperty("BirthDay");
ClearErrorFromProperty("BirthMonth");
ClearErrorFromProperty("BirthYear");
AddErrorForProperty("BirthDay", "Resources.PatientImport.InvalidDayMessage");
AddErrorForProperty("BirthMonth", "Resources.PatientImport.InvalidMonthMessage");
AddErrorForProperty("BirthYear", "Resources.PatientImport.InvalidYearMessage");
}
else
BirthDate = date;
}
}
}

我想在我的 中使用这个控件MainPage.xaml :
<UserControl x:Class="DatePicker.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DatePicker"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
<local:DateControl />
</Grid>
</UserControl>

我想在 DateControl 中定义一个属性,我将使用它来将我的 UserControl 与 MainPage.xaml 的 ViewModel 绑定(bind)

就像是:
<Grid x:Name="LayoutRoot" Background="White">
<local:DateControl Date="{Binding BirthDate, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"/>
</Grid>

BirthDate 是字符串类型属性。

如何更改我的用户控件,以便可以使用单独的 MVVM 在 MainPage.XAML 中绑定(bind)其属性

最佳答案

首先你需要设置DataContex您的 DateControlDateControlViewModel .在您的 DateControl xaml 你可以使用这个想法,或者在代码中的某个地方设置它(如 DateControl 的构造函数)或数据绑定(bind) DataContext到您要使用的 View 模型。

 <UserControl.Resources>
<viewModels:ViewDisplayTemplatesViewModel x:Key="viewModel" />
</UserControl.Resources>

<UserControl.DataContext>
<Binding Source="{StaticResource viewModel}"/>
</UserControl.DataContext>

其次,您需要在 DateControl 中定义一个依赖属性。 ,正如 Aardvark 在评论中提到的那样。我使用 propdp 片段(我认为它是 Silverlight 安装附带的,如果没有,您可以在 MSDN article 中看到它)。 Dependency 属性启用 xaml 中的绑定(bind)。

关于wpf - Silverlight 用户控件中的自定义绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com