ViewModel
は、UIコントロールをインスタンス化することは想定されていません。これは、ビューの責任である必要があります。
だからあなたのコードの中であなたがStackPanels
を作成しようとするべきではない、Ellipses
など
また、既に変更通知を持っているタイプを使用しようとする - の代わりに、 List<T>
使用ObservableCollection<T>
MSDNのために、私はお勧めしませんその値が変更されたときにリスト全体を置き換えます。
MVVMパターンでこれを行うための正しい方法は、このようRat
ためDataTemplate
を作成することです:
のViewModel:
public class MainWindowViewModel
{
public ObservableCollection<Rat> Rats { get; set; } =
new ObservableCollection<Rat>()
{
new Rat()
{
Name = "Fred",
Age = "19",
Sex = SexEnum.Male
},
new Rat()
{
Name = "Martha",
Age = "21",
Sex = SexEnum.Female
}
};
}
モデル - ラットとセックス:
public class Rat
{
public SexEnum Sex { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
public enum SexEnum
{
Female,
Male
}
セックスのモデル値を2色のいずれかで表示したい場合は、IValueConverter
を使用してください:
[ValueConversion(typeof(SexEnum), typeof(Brush))]
public class SexToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is SexEnum))
throw new ArgumentException("value not of type StateValue");
SexEnum sv = (SexEnum)value;
//sanity checks
if (sv == SexEnum.Female)
return Brushes.Red;
return Brushes.Blue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
これは、あなたの窓に使用されます。
ウィンドウ:
<Window x:Class="WpfApplication1.MainWindow"
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:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
xmlns:ViewModel="WpfApplication1.VM"
xmlns:Converters ="clr-namespace:WpfApplication1.Converters"
>
<Grid>
<Grid.Resources>
<Converters:SexToColorConverter x:Key="SexToBrushConverter"></Converters:SexToColorConverter>
</Grid.Resources>
<ComboBox x:Name="comboBox" ItemsSource="{Binding Rats}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="120">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="{Binding Sex, Converter={StaticResource SexToBrushConverter}}"></Ellipse>
<TextBlock Margin="5" Text="{Binding Name}"></TextBlock>
<TextBlock Margin="5" Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</Window>
注色を変更するComboBox.ItemTemplate
財産とConverters:SexToColorConverter
の宣言とその使用に割り当てられているDataTemplate
Fill
バインディング内の楕円の
更新4.4。私はあなたがのリストを追加したいようにしたいどのようにMVVM純粋主義者によっては、ターゲットはまたラットを選択することで推測リストに
<Window x:Class="WpfApplication1.MainWindow"
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:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
xmlns:Converters ="clr-namespace:WpfApplication1.Converters"
xmlns:vm="clr-namespace:WpfApplication1.VM">
<Window.DataContext>
<vm:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<Grid.Resources>
<Converters:SexToColorConverter x:Key="SexToBrushConverter"></Converters:SexToColorConverter>
</Grid.Resources>
<GroupBox>
<ItemsControl ItemsSource="{Binding Rats}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Margin="5"></CheckBox>
<Ellipse Width="10" Height="10" Fill="{Binding Sex, Converter={StaticResource SexToBrushConverter}}"></Ellipse>
<TextBlock Margin="5" Text="{Binding Name}"></TextBlock>
<TextBlock Margin="5" Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</GroupBox>
</Grid>
</Window>
を表示するCheckBoxes
とGroupBox
を使用して2016年16:30 ウィンドウRatViewModels
は、ブールのIsCheckedプロパティを持ち、ItemsSource
をObservableCollection<RatViewModel>
にバインドし、このリストをモデルと同期させます。List<Rat>
鮮やかな答えです。ありがとう、トン。質問を閉じる前に、ComboBoxまたはListBoxに切り替えるのではなく、Groupboxに固執する方法を知っていますか? アプリケーションのデザインを保持するためにGroupBoxを使用する必要があります。しかし、GroupBoxにはUniformGridではなくItemsSourceプロパティがありません。申し訳ありませんが –
は 'GroupBox' を逃した - ' GroupBox'は、あなたが '' ComboBox'などをItemControl'にアイテムのカスタム量をバインドする必要があり、実際に結合するためのものだけでなく、コンテナです。そこで、チェックボックスを含むようにテンプレートを編集する必要があります。あなたがそこで追求している目標は何ですか?その後、選択したラットを取得する必要がありますか? –
それだけで魅力をworkslike、あなたのassistance.Earnedmeためthanksaゲインに多くの時間! –