View Full Version : سوال: استفاده از DataContext ارسال شده به UserControl
sajjad_kochekian
سه شنبه 05 اسفند 1393, 17:28 عصر
سلام
من یک یوزر کنترل دارم که کمبو باکس افراد است.چطور می تونم اون را اطلاعات را از بایندینگ فرم به داخل User control بفرستم.
این روش جواب میده؟
چطور داخل UserControl از این استفاده کنم؟
<local:Gen_employeesCombobox x:Name="salesman" EmployeeLabel="فروشنده"
DataContext="{Binding Path=[salesman]}" />
تعریف یوزر کنترل
<ComboBox x:Name="Employee" MinWidth="100" Height="25" SelectedIndex="-1"
DisplayMemberPath="DisplayValue" SelectedValuePath="SelectedValue"
ItemsSource="{Binding Source={StaticResource Employeevs}}"
SelectedValue=?/>
ali_md110
سه شنبه 05 اسفند 1393, 19:15 عصر
اگر دیتاکانتکس فرم شما به ویومدل خاصی وصل شده باشه نیاز نیست دیتاکانتکس یوزر کنترل مشخص کنید جون بصورت سلسه مراتبی از فرمتون به ارث میبره
اگر فرم اصلیتون
<Window x:Class="SampleApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SampleApplication"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:Employee/>
</Window.DataContext>
و ویومدل شما
public class MainViewModel
{
public Employee MyEmployee { get; set; }
}
فقط کافی هست یوزر کنترل از تولباکستون دراگ کنید روی فرمتون
یا کد زیر رو درون یک کنترل مثل Grid بنویسید
<local:Gen_employeesCombobox></local:Gen_employeesCombobox>
<ComboBox x:Name="Employee" MinWidth="100" Height="25" SelectedIndex="-1"
DisplayMemberPath="فیلدی که نمایش داده میشه" SelectedValuePath="فیلدی که میخواید از کامبو بگیرید و توی بانک ذخیره کنید id"
ItemsSource="{Binding Source={StaticResource Employeevs}}"
SelectedValue=نام فیلدی توی بانک برنامه یا ویومدلتون/>
sajjad_kochekian
سه شنبه 05 اسفند 1393, 19:45 عصر
ممنون .
ولی SelectedValue نمیشه نام فیلد داد. چون به فیلد های مختلفی بایند میشه.
DataRow dr = prd.select();
if (dr != null)
{
{ hg.DataContext = dr.Table.DefaultView;
ali_md110
سه شنبه 05 اسفند 1393, 20:12 عصر
SelrctedValue باید به فیلدی وصل بشه که درون جدول بانکتون هست و مقدارش هنگام SaveChanged درون بانک ذخیره میشه
البته من نمیدوم روش بایدینگ شما بوسیله ORM هست یا دیتاست استفاده میکنید
sajjad_kochekian
سه شنبه 05 اسفند 1393, 22:41 عصر
خب من اسم فیلد را میدم به دیتاکانتکس User کنترل
<local:Gen_employeesCombobox x:Name="salesman" EmployeeLabel="فروشنده"
DataContext="{Binding Path=[salesman]}" />
اسم فیلدم اینجا salesman است ولی به فیلد های دیگه هم وصل میشه
از Data Row استفاده کردم.دیتاست ندارم
sajjad_kochekian
چهارشنبه 06 اسفند 1393, 14:50 عصر
از روش Dependency property رفتم ولی
یک مشکل وجود داره تو این روش بایندینگ انجام نمیشه
<local:Gen_employeesCombobox x:Name="salesman" EmployeeLabel="فروشنده"
Empcode="{Binding Path=[salesman],Mode=TwoWay}" />
EmployeeLabel و Empcode هر دو Dependency property هستند اولی انجام میشه که مقدار دستی میدم دومی که بایندیگ هست انجام نمی شه
وقتی بایندینگ را به یک textblock میدم جواب میده
<TextBlock x:Name="tt" Text="{Binding Path=[salesman]}"/>
و وقتی پروپرتی دوم یعنی Empcode را از قسمت code behind مقدار دهی می کنم هم جواب میده
salesman.Empcode=dr["salesman"];
مشکل از کجاست؟
تعریف پروپرتی
public static readonly DependencyProperty CaptionProperty =
DependencyProperty.Register("EmployeeLabel",
typeof(string), typeof(Gen_employeesCombobox),
new FrameworkPropertyMetadata("پرسنل"));
public string EmployeeLabel
{
get { return (string)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
public static readonly DependencyProperty EmpcodeProperty =
DependencyProperty.Register("Empcode",
typeof(object), typeof(Gen_employeesCombobox)
);
public object Empcode
{
get { return (object)GetValue(EmpcodeProperty); }
set { SetValue(EmpcodeProperty, value); }
}
تعریف Object داخل User Control
<ComboBox x:Name="Employee" MinWidth="100" Height="25" SelectedIndex="-1"
DisplayMemberPath="DisplayValue" SelectedValuePath="SelectedValue"
ItemsSource="{Binding Source={StaticResource Employeevs}}"
SelectedValue="{Binding Empcode,Mode=TwoWay}"/>
ali_md110
چهارشنبه 06 اسفند 1393, 22:48 عصر
ببینید وقتی میخاید DataContext برای یک فرم یا User Controll مشخص کنید باید به یک کلاس که حاوی تعدادی عضو هست منتصب کنید نه یک فیلد خاص
<local:Gen_employeesCombobox x:Name="salesman" EmployeeLabel="فروشنده"
Empcode="{Binding Path=[salesman],Mode=TwoWay}" />
این روش کاملا اشتباه هست دوست من
چون کانتکست یعنی منبعی برای برنامه ما و الان منبع شما فقط همین یک فیلد هست؟؟؟؟
sajjad_kochekian
پنج شنبه 07 اسفند 1393, 19:35 عصر
این روشی که الان رفتم که دیتا کانتکس نیست.
از روش پروپرتی رفتم ولی بازم جواب نمی ده.
پروپرتی را مگه نمیشه با بایندیگ مقدار دهی کرد؟
ali_md110
پنج شنبه 07 اسفند 1393, 20:59 عصر
شما یک کلاس بنام مدل ومعادل با جدول بانکتون بسازید
public class Model
{
public int id { get; set; }
public string name { get; set; }
}
ویک کلاس به نام ویومدل برا ی کانتکس فرمتون
public class MainViewModel
{
public ObservableCollection<Model> myList()
{
var templist = new ObservableCollection<Model>();
foreach (var list in myDataTable())
{
templist = new ObservableCollection<Model>
{
new Model
{
, name=list.name
id= list.id
}
};
}
return templist;
}
; }
}
و توی کلاس ویومدل Property از نوع یک لیست جنریک مثل ObservableCollection تعریف کنید مثل بالا که من تعریف کردم
و این پراپرتی رو با مقداری که از یک دیتاتیبل یا DataRow میکیرید با یک حلقه پر کنید
بعد کلاس ویومدل رو به عنوان دیتاکانتکس به فرم یا یوزر کنترلتون منتصب کنید
و کامبوباکستون رو با لیست جنریک بایند کنید
ItemsSource="{Binding DataContext.myList}}"
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.