Binding

 
0
 
.NET
ava
Prontit | 05.07.2012, 14:08
Здравствуйте!

Делаю проект на Silverlight.

Имеется три radioButtn и один comboBox. необходимо связать радиокнопки со значениями в комбобоксе. Например, выбираю Radiobuttn1 в ComboBox появляются Items (1, 2, 3), выбираю Radiobuttn2, появляются Items (А, Б, В) и так далее. Т.е. где-то хранить группы Items, и заполнять Comboboxв зависимости от выбранного Radiobuttn.

Подскажите, как можно это организовать с помощью Binding. Как заполнять программно, используя C# я знаю.

Заранее благодарю!
Comments (5)
ava
erm0l0v | 06.07.2012, 12:36 #
Забиньдить ItemSourse ComboBox на ObservableCollection, при выборе определенного radioButtn добавлять(удалять) соответствующий элемент в ObservableCollection


public static class CollectionManager
{
static ObservableCollection<string> _items;
public static ObservableCollection<string> Items
{
get
{
return _items == null ? _items = new ObservableCollection<string>() : _items;
}
}
}

public class RadioViewModel
{
public string Element { get; set; }

bool _isSelect = false;
public bool IsSelect
{
get
{
return _isSelect;
}
set
{
_isSelect = value;
if (_isSelect)
CollectionManager.Items.Add(Element);
else
CollectionManager.Items.Remove(Element);
}
}
}

public class MainViewModel
{
public ObservableCollection<string> Items
{
get
{
return CollectionManager.Items;
}
}

ObservableCollection<RadioViewModel> _ribioList = null;
public ObservableCollection<RadioViewModel> RibioList
{
get
{
if (_ribioList == null)
{
_ribioList = new ObservableCollection<RadioViewModel>();
_ribioList.Add(new RadioViewModel { Element = "Items (1, 2, 3)" });
_ribioList.Add(new RadioViewModel { Element = "Items (А, Б, В)" });
}
return _ribioList;
}
}
}



<UserControl x:Class="SilverlightApplication1.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:view="clr-namespace:SilverlightApplication1"
d:DesignHeight="300"
d:DesignWidth="400"
mc:Ignorable="d">
<UserControl.Resources>
<view:MainViewModel x:Key="model" />
<DataTemplate DataType="view:RadioViewModel">
<RadioButton Content="{Binding Element}" IsChecked="{Binding IsSelect, Mode=TwoWay}" />
</DataTemplate>
</UserControl.Resources>
<Grid DataContext="{StaticResource model}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Items}" />
<ListBox Grid.Row="1" ItemsSource="{Binding RibioList}" />
</Grid>
</UserControl>
ava
erm0l0v | 06.07.2012, 13:28 #
А вернее так:

public static class CollectionManager
{
static ObservableCollection<string> _items;
public static ObservableCollection<string> Items
{
get
{
return _items == null ? _items = new ObservableCollection<string>() : _items;
}
}
}

public class RadioViewModel
{
public string[] Elements { get; set; }

bool _isSelect = false;
public bool IsSelect
{
get
{
return _isSelect;
}
set
{
_isSelect = value;
if (_isSelect)
foreach(var e in Elements)
CollectionManager.Items.Add(e);
else
foreach (var e in Elements)
CollectionManager.Items.Remove(e);
}
}
}

public class MainViewModel
{
public ObservableCollection<string> Items
{
get
{
return CollectionManager.Items;
}
}

ObservableCollection<RadioViewModel> _ribioList = null;
public ObservableCollection<RadioViewModel> RibioList
{
get
{
if (_ribioList == null)
{
_ribioList = new ObservableCollection<RadioViewModel>();
_ribioList.Add(new RadioViewModel { Elements = new string[] {"1", "2", "3" } });
_ribioList.Add(new RadioViewModel { Elements = new string[] {"A", "B", "C"} });
}
return _ribioList;
}
}
}

public class ConverterElement : IValueConverter, IMarkupExtension<ConverterElement>
{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is IEnumerable<string>)
return String.Format("Items ({0})", String.Join(", ", (value as IEnumerable<string>)));
throw new ArgumentException();
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}

ConverterElement _converter = null;
public ConverterElement ProvideValue(IServiceProvider serviceProvider)
{
return _converter == null ? _converter = new ConverterElement() : _converter;
}
}



<UserControl x:Class="SilverlightApplication1.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:view="clr-namespace:SilverlightApplication1"
d:DesignHeight="300"
d:DesignWidth="400"
mc:Ignorable="d">
<UserControl.Resources>
<view:MainViewModel x:Key="model" />
<DataTemplate DataType="view:RadioViewModel">
<RadioButton Content="{Binding Elements, Converter={view:ConverterElement}}" IsChecked="{Binding IsSelect, Mode=TwoWay}" />
</DataTemplate>
</UserControl.Resources>
<Grid DataContext="{StaticResource model}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Items}" />
<ListBox Grid.Row="1" ItemsSource="{Binding RibioList}" />
</Grid>
</UserControl>
ava
Prontit | 09.07.2012, 06:30 #
Цитата (erm0l0v @ 6.7.2012, 13:28)
А вернее так:


  public static class CollectionManager
  {
  static ObservableCollection<string> _items;
  public static ObservableCollection<string> Items
  {
  get
  {
  return _items == null ? _items = new ObservableCollection<string>() : _items;
  }
  }
  }


  public class RadioViewModel
  {
  public string[] Elements { get; set; }


  bool _isSelect = false;
  public bool IsSelect
  {
  get
  {
  return _isSelect;
  }
  set
  {
  _isSelect = value;
  if (_isSelect)
  foreach(var e in Elements)
  CollectionManager.Items.Add(e);
  else
  foreach (var e in Elements)
  CollectionManager.Items.Remove(e);
  }
  }
  }


  public class MainViewModel
  {
  public ObservableCollection<string> Items
  {
  get
  {
  return CollectionManager.Items;
  }
  }


  ObservableCollection<RadioViewModel> _ribioList = null;
  public ObservableCollection<RadioViewModel> RibioList
  {
  get
  {
  if (_ribioList == null)
  {
  _ribioList = new ObservableCollection<RadioViewModel>();
  _ribioList.Add(new RadioViewModel { Elements = new string[] {"1", "2", "3" } });
  _ribioList.Add(new RadioViewModel { Elements = new string[] {"A", "B", "C"} });
  }
  return _ribioList;
  }
  }
  }


  public class ConverterElement : IValueConverter, IMarkupExtension<ConverterElement>
  {


  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
  if (value is IEnumerable<string>)
  return String.Format("Items ({0})", String.Join(", ", (value as IEnumerable<string>)));
  throw new ArgumentException();
  }


  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
  throw new NotImplementedException();
  }


  ConverterElement _converter = null;
  public ConverterElement ProvideValue(IServiceProvider serviceProvider)
  {
  return _converter == null ? _converter = new ConverterElement() : _converter;
  }
  }







<UserControl x:Class="SilverlightApplication1.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:view="clr-namespace:SilverlightApplication1"
  d:DesignHeight="300"
  d:DesignWidth="400"
  mc:Ignorable="d">
  <UserControl.Resources>
  <view:MainViewModel x:Key="model" />
  <DataTemplate DataType="view:RadioViewModel">
  <RadioButton Content="{Binding Elements, Converter={view:ConverterElement}}" IsChecked="{Binding IsSelect, Mode=TwoWay}" />
  </DataTemplate>
  </UserControl.Resources>
  <Grid DataContext="{StaticResource model}">
  <Grid.RowDefinitions>
  <RowDefinition Height="Auto" />
  <RowDefinition Height="*" />
  </Grid.RowDefinitions>
  <ComboBox ItemsSource="{Binding Items}" />
  <ListBox Grid.Row="1" ItemsSource="{Binding RibioList}" />
  </Grid>

</UserControl>


Спасибо за ответ, попробую.

Я думал что это можно как-то проще сделать, вообще без кода на C#. Хранить "блоки" значений в <UserControl.Resources> с уникальными id, и затем по этому id делать binding при выборе определенного radiobutton. А так получается довольно много кода, и проще тогда вообще сделать просто event на radiobutton click и заполнять combobox, нет? smile
ava
erm0l0v | 09.07.2012, 08:17 #
Основная идея биндинга не в том чтобы уменьшить количество кода а в том чтобы разделить логику приложения и реализацию интерфейса. Приведенный в примере код можно будет использовать например в консольном приложении или в приложении на ASP.NET, меняя только реализации UI.

Реализация через событие разумеется всегда будет более компактная чем реализация с использованием биндинга, но цена этой компактности практически полное отсутствие гибкости, и читабельности кода.

Реализовать с помощью XAML можно попробовать, хотя в Silverlight не так много возможностей чтобы использовать для разработки только XAML. Например даже чтобы триггер описать вам придется писать код.
ava
Prontit | 10.07.2012, 11:52 #
Цитата (erm0l0v @ 9.7.2012, 08:17)
Основная идея биндинга не в том чтобы уменьшить количество кода а в том чтобы разделить логику приложения и реализацию интерфейса. Приведенный в примере код можно будет использовать например в консольном приложении или в приложении на ASP.NET, меняя только реализации UI.



Реализация через событие разумеется всегда будет более компактная чем реализация с использованием биндинга, но цена этой компактности практически полное отсутствие гибкости, и читабельности кода.



Реализовать с помощью XAML можно попробовать, хотя в Silverlight не так много возможностей чтобы использовать для разработки только XAML. Например даже чтобы триггер описать вам придется писать код.

Спасибо за пояснения! буду пробовать.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit