آشنایی با WPF قسمت پنجم : DataContext بخش دوم
نویسنده: علی یگانه مقدم
تاریخ: ۱۳۹۴/۰۲/۲۴ ۱۰:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
// Do the conversion from bool to visibility
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
// Do the conversion from visibility to bool
}
} <Window x:Class="test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:نامی دلخواه="clr-namespace:فضای نامی که کلاس مبدل در آن قرار دارد"
>
<Window.Resources>
<نام دلخواهی که در بالا تعریف کرده اید: ClassNameنام کلاس x:Key="کلید این آیتم در ریسورس"/>
</Window.Resources> {Binding نام پراپرتی کلاس, Converter={StaticResource کلید آیتم مربوطه در ریسورس}, ConverterParameter=پارامتری که به کلاس مبدل پاس میشود} using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace test.ValueConverters
{
public class GenderConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var ParameterString = parameter as string;
if (ParameterString == null)
return DependencyProperty.UnsetValue;
bool bparam;
bool test = bool.TryParse(parameter.ToString(), out bparam);
if (test)
{
return ((bool)value).Equals(bparam);
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
} <Window x:Class="test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:valueConverters="clr-namespace:test.ValueConverters"
Title="MainWindow" Height="511.851" Width="525">
<Window.Resources>
<valueConverters:GenderConverter x:Key="GenderConverter"/>
</Window.Resources>
</window> نکته: در صورتی که بعد از تعریف ریسورس با خطای زیر روبرو شدید و محیط طراحی Design را از دست دادید یکبار پروژه را بیلد کنید تا مشکل حل شود.
The name "GenderConverter" does not exist in the namespace "clr-namespace:test.ValueConverters".
<RadioButton GroupName="Gender" IsChecked="{Binding Gender, Converter={StaticResource GenderConverter}, ConverterParameter=True}" Name="RdoMale" >Male</RadioButton>
<RadioButton GroupName="Gender" IsChecked="{Binding Gender, Converter={StaticResource GenderConverter}, ConverterParameter=False}" Name="RdoFemale" Margin="0 5 0 0" >Female</RadioButton> <RadioButton GroupName="Gender" IsChecked="{Binding Gender}" Name="RdoMale" >Male</RadioButton> public enum FieldOfWork
{
Actor=0,
Director=1,
Producer=2
}
public class Person : INotifyPropertyChanged
{
public bool Gender { get; set; }
public string ImageName { get; set; }
public string Country { get; set; }
public DateTime Date { get; set; }
public FieldOfWork FieldOfWork { get; set; }
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
} public FieldOfWork FieldOfWork { get; set; } using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace test.ValueConverters
{
public class EnumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var ParameterString = parameter as string;
if (ParameterString == null)
return DependencyProperty.UnsetValue;
if (Enum.IsDefined(value.GetType(), value) == false)
return DependencyProperty.UnsetValue;
object paramvalue = Enum.Parse(value.GetType(), ParameterString);
return paramvalue.Equals(value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
} <Window.Resources>
<valueConverters:GenderConverter x:Key="GenderConverter"/>
<valueConverters:EnumConverter x:Key="EnumConverter"></valueConverters:EnumConverter>
</Window.Resources> <CheckBox Name="ChkActor" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumConverter}, ConverterParameter=Actor}" >Actor/Actress</CheckBox>
<CheckBox Name="ChkDirector" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumConverter}, ConverterParameter=Director}" >Director</CheckBox>
<CheckBox Name="ChkProducer" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumConverter}, ConverterParameter=Producer}" >Producer</CheckBox> public static Person GetPerson()
{
return new Person()
{
Name = "Leo",
Gender =true,
ImageName ="man.jpg",
Country = "Italy",
FieldOfWork = test.FieldOfWork.Actor,
Date = DateTime.Now.AddDays(-3)
};
} public enum FieldOfWork
{
Actor=0,
Director=1,
Producer=2
}
public class Person : INotifyPropertyChanged
{
public bool Gender { get; set; }
public string ImageName { get; set; }
public string Country { get; set; }
public DateTime Date { get; set; }
public IList<FieldOfWork> FieldOfWork { get; set; }
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
}
public static Person GetPerson()
{
return new Person
{
Name = "Leo",
Gender = true,
ImageName = "man.jpg",
Country = "Italy",
FieldOfWork = new FieldOfWork[] { test.FieldOfWork.Actor, test.FieldOfWork.Producer },
Date = DateTime.Now.AddDays(-3)
};
}
} using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace test.ValueConverters
{
public class EnumList : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var ParameterString = parameter as string;
if (ParameterString == null)
return DependencyProperty.UnsetValue;
var enumlist= (IList) value;
if(enumlist==null && enumlist.Count<1)
return DependencyProperty.UnsetValue;
if (Enum.IsDefined(enumlist[0].GetType(), ParameterString) == false)
return DependencyProperty.UnsetValue;
/*
foreach (var item in enumlist)
{
object paramvalue = Enum.Parse(item.GetType(), ParameterString);
bool result = item.Equals(paramvalue);
if (result)
return true;
}
return false;
*/
return (from object item in enumlist let paramvalue = Enum.Parse(item.GetType(), ParameterString) select item.Equals(paramvalue)).Any(result => result);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
} <Window.Resources>
<valueConverters:GenderConverter x:Key="GenderConverter"/>
<valueConverters:EnumConverter x:Key="EnumConverter"></valueConverters:EnumConverter>
<valueConverters:EnumList x:Key="EnumList"></valueConverters:EnumList>
</Window.Resources> <CheckBox Name="ChkActor" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumList}, ConverterParameter=Actor}" >Actor/Actress</CheckBox>
<CheckBox Name="ChkDirector" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumList}, ConverterParameter=Director}" >Director</CheckBox>
<CheckBox Name="ChkProducer" IsChecked="{Binding FieldOfWork, Converter={StaticResource EnumList}, ConverterParameter=Producer}" >Producer</CheckBox>
بدیهی است خروجیهای بالا برای کنترل هایی است که مقدار Boolean را میپذیرند و برای سایر کنترلها باید با کمی تغییر در کد و نوع برگشتی که تحویل خروجی متد مبدل میشود، دهید.دانلود فایلهای این قسمت