PDA

View Full Version : سوال: عدم انجام binding زمان استفاده از آن در code-behind



teardrop
جمعه 28 بهمن 1390, 21:55 عصر
به نام خدا

سلام

مشکلی در biding داشتم که به شرح زیر است:
در قسمت <Window.Resources> یک TreeViewItem به عنوان یک نمونه از آیتم سفارشی شده قرار داده ام. و در 3 جا از biding استفاده کردم.ولی در code behind وقتی آیتم سورس رو مقدار دهی میکنم، biding به صورت صحیح انجام نمی گیرد.

<Window.Resources>
<!--Packet-->
<TreeViewItem x:Key="treePacket">
<StackPanel>
<TextBlock Text="{Binding IDP}" />
<StackPanel Orientation="Horizontal">
<Image Source="/treeviewDir;component/Images/package.png" />
<TextBlock Foreground="Red"
Tag="{Binding IDP}"
Text="{Binding PacketName}">
<TextBlock.BitmapEffect>
<DropShadowBitmapEffect />
</TextBlock.BitmapEffect>
</TextBlock>
</StackPanel>
</StackPanel>
</TreeViewItem>

</Window.Resources>
<Grid>
<TreeView x:Name="tree" Margin="0,0,272,0">

</TreeView>


var q = from p in libcds.Packets
where p.IDP == 1
select new
{
IDP = p.IDP,
PacketName = p.PacketName
};


((TreeViewItem)this.FindResource("treePacket")).Items.Clear();
//TreeViewItem ttt = (TreeViewItem)this.FindResource("treePacket");
TreeViewItem tt = (TreeViewItem)this.FindResource("treePacket");


tree.Items.Add(tt);
tree.ItemsSource = q;

از شما دوستان می خوام اگه میتونید مشکل biding شدن رو برطرف کنید.
کاری کنید که اون اطلاعات در اون فیلد ها قرار بگیرد.

PetekDincos
جمعه 28 بهمن 1390, 23:07 عصر
با سلام
دوست عزیز شما هنگام تعریف آیتم برای یک کنترل لیستی می تونید DataTemplate برای اون آیتم تعریف کرده و به خاصیت ItemTemplate اون کنترل بایند کنید و برای اینکار در مثال شما کد xaml فرمت رو به این صورت تغییر بده


<Window.Resources>
<!--Packet-->
<DataTemplate x:Key="treePacket" DataType="{x:Type TreeViewItem}">
<StackPanel>
<TextBlock Text="{Binding IDP}" />
<StackPanel Orientation="Horizontal">
<Image Source="/treeviewDir;component/Images/package.png" />
<TextBlock Foreground="Red"
Tag="{Binding IDP}"
Text="{Binding PacketName}">
<TextBlock.BitmapEffect>
<DropShadowBitmapEffect />
</TextBlock.BitmapEffect>
</TextBlock>
</StackPanel>
</StackPanel>
</DataTemplate>

</Window.Resources>
<Grid>
<TreeView x:Name="tree" ItemTemplate="{StaticResource treePacket}" Margin="0,0,272,0">

</TreeView>


و در CodeBehind پراپرتی ItemSource کنترلت رو به یه لیست یا کوئری بایند کن با تشکر

teardrop
شنبه 29 بهمن 1390, 23:13 عصر
با سلام
دوست عزیز شما هنگام تعریف آیتم برای یک کنترل لیستی می تونید DataTemplate برای اون آیتم تعریف کرده و به خاصیت ItemTemplate اون کنترل بایند کنید و برای اینکار در مثال شما کد xaml فرمت رو به این صورت تغییر بده


<Window.Resources>
<!--Packet-->
<DataTemplate x:Key="treePacket" DataType="{x:Type TreeViewItem}">
<StackPanel>
<TextBlock Text="{Binding IDP}" />
<StackPanel Orientation="Horizontal">
<Image Source="/treeviewDir;component/Images/package.png" />
<TextBlock Foreground="Red"
Tag="{Binding IDP}"
Text="{Binding PacketName}">
<TextBlock.BitmapEffect>
<DropShadowBitmapEffect />
</TextBlock.BitmapEffect>
</TextBlock>
</StackPanel>
</StackPanel>
</DataTemplate>

</Window.Resources>
<Grid>
<TreeView x:Name="tree" ItemTemplate="{StaticResource treePacket}" Margin="0,0,272,0">

</TreeView>


و در CodeBehind پراپرتی ItemSource کنترلت رو به یه لیست یا کوئری بایند کن با تشکر

سلام دوست(ان) عزیز
من می خوام کاری بکنم که treeviewItem دلخواه خودم رو که بوسیله XAML طراحی کردم رو به صورت دستی به treeView اضافه کنم.ولی در اینجا مشکلی که وجود داره عدم biding شدن است، و از طرفی وقتی که از biding استفاده کنم مجبورم که itemsSource رو مقدار دهی کنم، که اینکار موجب عدم اضافه یا حدف آیتم به صورت دستی در treeview میشه.
و قبل از این هم من کار رو با المان HierarchicalDataTemplate شروع کردم.که اون مشکلاتی داشت، مثل اینکه برای استفاده از اون باید برای هر عمق یکی از این المان ها رو در XAML تعریف کرد، از طرفی که ممکن عمق درخت من از قبل معلوم نباشه.

من 2 راه حل برای این کار پیدا کردم:
1-هر آیتم(که البته داده ای درون کنترل ها داده نشده است) رو از طریق Code-Behind پیمایش کنم تا مقدار دهی یا مقدار گیری رو انجام بدم.
2-کلاس TreeviewItem رو از طریق ارث بری دوباره نویسی کنم.(که دیگه از XAML نمی تونم استفاده کنم)

ولی شاید راه حل های ساده تری وجود داشته باشه که شما دوستان بتونید به من ارایه نمایید.
با تشکر.

PetekDincos
یک شنبه 30 بهمن 1390, 10:18 صبح
با سلام
دوست عزیز اگه بخواهی برای یک کنترل مثل TreeView که می تونه چندین لیست رو به صورت Master-Detail نشون بده استفاده کنید بایستی برای هر سطحت از یک نوع (کلاس یا جدول) استفاده کنی که با یکدیگر رابطه دارند و اگه در هر سطح آیتمت با سطح دیگه فرق داره بایستی از ساختار HierarchicalDataTemplate استفاده کنید و برای هر سطح یه DataTemplate متفاوت درست کنی که در کتاب Pro WPF انتشارات Apress یه مثال وجود داره که در دو سطح این کار رو انجام داده می تونی استفاده کنی و در مورد اضافه یا حذف کردن آیتم چون بالاخره بایستی کنترل TreeView شما به یه چیزی بایند باشه مثل یه لیست که از اون لیست می تونی ایتمی رو حذف یا اضافه کنی و اگه کنترلت در چندین سطح می خواهد نمایش بده این لیستهای جدید رو با هم دیگه دوباره join کرده و به کنترلت بایند کنی با تشکر