Я бы рекомендовал использовать Html.RenderAction
и PartialViewResults для этого; он позволит вам отображать одни и те же данные, но у каждого частичного вида все еще будет одна модель представления и устраняет необходимость в BigViewModel
. Таким образом, ваше представление содержит примерно следующее:
@Html.RenderAction("Login")
@Html.RenderAction("Register")
Где Login
& amp; Register
- оба действия в вашем контроллере, определенные следующим образом:
public PartialViewResult Login( )
{
return PartialView( "Login", new LoginViewModel() );
}
public PartialViewResult Register( )
{
return PartialView( "Register", new RegisterViewModel() );
}
Login
& amp; Register
будет пользовательским элементом управления, находящимся либо в текущей папке View, либо в общей папке, и хотел бы что-то вроде этого:
/Views/Shared/Login.cshtml: (или / Views / MyView /Login.cshtml)
@model LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
/Views/Shared/Register.cshtml: (или /Views/MyView/Register.cshtml)
@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Name)
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
И там у вас есть действие одного контроллера, просмотр и просмотр файла для каждого действия с каждым полностью отличным и не зависящим друг от друга для чего-либо.
Ниже приведен простой пример того, как вы можете использовать DependencyProperty
в UWP.
XAML
<Page x:Name="loginPage"
... >
<TextBlock Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
C #
using Windows.UI.Xaml;
...
public string welcomeText
{
get { return (string)GetValue(welcomeTextProperty); }
set { SetValue(welcomeTextProperty, value); }
}
// Using a DependencyProperty as the backing store for welcomeText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty welcomeTextProperty =
DependencyProperty.Register("welcomeText", typeof(string), typeof(LoginPage), null);
В приведенном выше примере мы связываем зависимость свойство welcomeText
, которое мы определяем в коде (C #) для TextBlock
.
Обратите внимание, ElementName=loginPage
- это имя страницы, которое мы определяем в XAML.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ 1:
Из того, что я могу понять из вашего кода, вы пытаетесь получить значение PropertyType
, чтобы преобразовать его в другой тип.
Для этого требования вы можете сделать что-то вроде этого:
В следующем примере у нас есть специальный преобразователь значения, который преобразует длину строки в Visibility
, другими словами, вернуть Visibility
] на основе длины строки, которую он получает для преобразования, а также проверяет, относится ли предоставленный тип value
к типу string
.
XAML
<Page x:Name="loginPage"
xmlns:converters="using:projectName.converters"
... >
<Page.Resources>
<converters:LengthToVisibilityConverter x:Key="lengthToVisibilityKey"></converters:LengthToVisibilityConverter>
</Page.Resources>
...
<TextBlock x:Name="flyoutTxt" Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
<TextBlock Text="Has some text" Visibility="{Binding Path=Text,ElementName=flyoutTxt,Converter={StaticResource lengthToVisibilityKey}}"></TextBlock>
Здесь видимость второго TextBlock
основана на длине текста flyoutTxt
.
C #
Пользовательский класс преобразователя для преобразования длины в видимость:
class LengthToVisibilityConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{ //checking if type of "value" is String and its length
if(value != null && value.GetType() == typeof(string) &&
value.ToString().Length > 0)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
Обратите внимание, что никаких изменений в зависимости свойства, определенной выше, не требуется. [Тысяча сто двадцать девять]