2016-10-03 75 views
1

我正在尝试构建一个简单的应用程序,该应用程序具有一个用于定义玩家名称和样式的控件。该控件可用于玩家1和玩家2.第一个目标是设置两个单选按钮组,以便每个玩家可以相应地进行选择。第二个是将这个控件的数据传递给主页的视图模型。我如何完成这些事情?自定义属性和在视图模型之间进行数据通信

这里的控制是什么样子:

enter image description here

以下是项目结构:

enter image description here

Player.cs只需持有参照球员的风格和他们的名字

namespace temp 
{ 
    class Player 
    { 
     // offensive/defensive 
     public string Style { get; set; } 

     public string Name { get; set; } 
    } 
} 

它也充当PlayerInfoControl的视图模型。下面是它的代码:

<UserControl x:Class="temp.Controls.PersonInfoControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:temp.Controls" 
      xmlns:vm="clr-namespace:temp" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <UserControl.Resources> 
     <vm:Player x:Key="ViewModel" /> 
    </UserControl.Resources> 

    <Grid DataContext="{StaticResource ViewModel}"> 
     <StackPanel Orientation="Horizontal" Height="50"> 
      <StackPanel Margin="0,0,15,0" VerticalAlignment="Center"> 
       <RadioButton Content="Offense" GroupName="{Binding Group}" /> 
       <RadioButton Content="Defense" GroupName="{Binding Group}" /> 
      </StackPanel> 
      <StackPanel Margin="0,0,15,0" Orientation="Horizontal" VerticalAlignment="Center"> 
       <Label Content="Name" /> 
       <TextBox Width="100" Height="25" Text="{Binding Name}"/> 
      </StackPanel> 
     </StackPanel> 
    </Grid> 
</UserControl> 

主窗口是一个简单的网格定义playerInfoControl两次

<Window x:Class="temp.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:temp" 
     xmlns:controls="clr-namespace:temp.Controls" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <local:MainWindowViewModel x:Key="ViewModel" /> 
    </Window.Resources> 

    <Grid DataContext="{StaticResource ViewModel}"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="160" /> 
     </Grid.RowDefinitions> 

     <controls:PersonInfoControl Grid.Row="0" Group="p1" /> 
     <controls:PersonInfoControl Grid.Row="1" Group="p2" /> 
    </Grid> 
</Window> 

最后,有MainWindowViewModel,我需要中继的数据,这是由PlayInfoControl抓获。

namespace temp 
{ 
    class MainWindowViewModel 
    { 
     Player Player1 = new Player(); 
     Player Player2 = new Player(); 
    } 
} 

我第一次尝试解决设置组。我创建了一个自定义的依赖项属性,但是由于应用程序无法构建,因此我不确定我在做什么错误。

public partial class PersonInfoControl : UserControl 
    { 
     public PersonInfoControl() 
     { 
      InitializeComponent(); 
     } 

     public string Group 
     { 
      get { return (string)GetValue(GroupProperty); } 
      set { SetValue(GroupProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for Group. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty GroupProperty = 
      DependencyProperty.Register("Group", typeof(string), typeof(Player), new PropertyMetadata(0)); 
    } 

这就好比错误的外观:

enter image description here

回答

1

您需要使用正确类型的依赖项属性的默认值。在你的情况下,它的0不能被分配给一个字符串。更换

new PropertyMetadata(0)); 

new PropertyMetadata(string.Empty)); 
+0

MainWindow.xaml被抱怨 – haosmark

+0

“玩家类型必须自DependencyObject派生”我伸出球员:DependencyObject的和组现在工作正常!如何将我使用Player.cs收集的数据传递给MainWindowViewModel.cs? – haosmark

相关问题