0

現在、MVVMでsilverlight5を使用しています。SL5では、次のことを行う必要があります。xaml(デザインページ)に3つのテキストボックスと1つのボタンコントロールとデータグリッドがあります。

ここにデザインビュー(Xaml)があります:

<UserControl.DataContext>
        <VC:EmployeeListViewModel />
    </UserControl.DataContext>
        <Grid x:Name="LayoutRoot">
        <my:DataGrid x:Name="McDataGrid" ItemsSource="{Binding Employees,UpdateSourceTrigger=PropertyChanged}" Margin="130,151,0,0" Height="137" VerticalAlignment="Top" RowBackground="#AA5D9324" AutoGenerateColumns="True" HorizontalAlignment="Left" Width="193">
        </my:DataGrid>
        <Button Content="Show Message" Width="100" Height="25" Margin="256,75,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <si:CallDataMethod Method="AddEmployeeCommand"/>
                    <si:ShowMessageBox Caption="Thank you"
                                       Message="Thanks for trying the Example"
                                       MessageBoxButton="OK"/>
                    <si:SetProperty TargetName="LayoutRoot" 
            PropertyName="Background" Value="PaleGoldenrod"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
     <TextBlock FontWeight="Bold" Height="26" HorizontalAlignment="Left" Margin="47,12,0,0" Name="textBlock1" Text="First Name:" VerticalAlignment="Top" Width="77" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Employee.Fname}" />
        <TextBlock FontWeight="Bold" Height="25" HorizontalAlignment="Left" Margin="35,44,0,0" Name="textBlock2" Text="Second Name:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,44,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />
        <TextBlock FontWeight="Bold" Height="23" HorizontalAlignment="Left" Margin="45,75,0,0" Name="textBlock3" Text="Department:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,75,0,0" Name="textBox3" VerticalAlignment="Top" Width="120" />
        <!-- Add reference to Microsoft.Expression.Interactions.dll, System.Windows.Interactivity.dll -->
            <!-- Use mvvmxmlns snippet to add i and ei namespace prefixes -->
       </ComboBox> 
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="64,122,0,0" Name="textBlock4" Text="Choose:" VerticalAlignment="Top" FontWeight="Bold" />
</Grid>
</UserControl>

同じプロジェクトで、「ViewModel」という名前のフォルダーを 1 つ作成します。同じフォルダーに、EmployeeListViewModel.cs という名前のクラス ファイルを 1 つ追加します。

私の質問はこれです。テキストボックスの値をviewmodel[EmployeeListViewModel]に渡し、それをDatagridに挿入する方法。

EmployeeListViewModel.cs:

public class EmployeeListViewModel:INotifyPropertyChanged 
    {
        public ObservableCollection<Employee> Employees { get; private set; }

        public EmployeeListViewModel()
        {
            Employees = Silverlight_MVVM.DataHelper.EmployeeDataHelper.EmployeeData ();
        }

        private Employee _SelectedEmployee;
        public Employee SelectedEmployee
        {
            get
            {
                return _SelectedEmployee;
            }
            set
            {
                _SelectedEmployee = value;
                RaisePropertyChanged("SelectedEmployee");
            }
        }

        private Employee _Names;
        public Employee Names
        {
            get
            {
                return _Names;
            }
            set
            {
                _Names = value;
                RaisePropertyChanged("Names");
            }
        }

        public void HandleShowMessage()
        {
           // MessageBox.Show("Hello " + Names + ",Welcome to EventTrigger for MVVM.");

        }
        public RelayCommand _AddEmployeeCommand;
        /// <summary>
        /// Returns a command that show the customer.
        /// </summary>
        public ICommand AddEmployeeCommand
        {
            get
            {
                if (_AddEmployeeCommand == null)
                {
                    _AddEmployeeCommand = new RelayCommand(
                        param => this.AddEmployee(),
                        param => this.CanAddEmployee
                        );
                }
                return _AddEmployeeCommand;
            }
        }

        public bool CanAddEmployee
        {
            get
            {
                 return true;
            }
        }

        public void AddEmployee()
        {
            //Employee newEmployee = new Employee("New1);
            Employee newEmployee = new Employee() **{};**
           --> **Here i have to pass the value.. How is it possible..?**
            Employees.Add(newEmployee);
            SelectedEmployee = newEmployee;
        }



        #region INotifyPropertyChanged
        // [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
}
4

3 に答える 3

1

あなたがこれについてどのように行っているか100%確信が持てませんか?通常、選択した従業員にグリッドをバインドしてから、選択した従業員のプロパティにテキスト ボックスの値をバインドします。行を変更すると、グリッドで現在選択されている行の値を反映するように更新されます。次に、新しい空白の従業員を追加すると、テキスト ボックスに入力されるまで値が空白になります。もちろん、大量の blabnk 行が追加されないようにするために、何らかの検証を組み込む必要があります。

あなたがどのようにそれをしたいのかについて私の理解が正しければ、テキストボックスの値は選択された行に関連していませんが、それらの値を持つ新しい従業員を追加するためだけに使用されますか? これを実現するには、Textbox を Viewmodel の文字列値にバインドすることをお勧めします。現在、実際には存在しないように見えるものにそれらをバインドしています。代わりに、ビュー モデルの独自のプロパティにバインドします。

private string _employeeFirstName; 
    public string EmployeeFirstName 
    { 
        get 
        { 
            return _employeeFirstName; 
        } 
        set 
        { 
            _employeeFirstName= value; 
            RaisePropertyChanged("EmployeeFirstName"); 
        } 
    } 

次に、xaml でそのプロパティにバインドします - Mode=TwoWay を使用して、ビューモデルも更新を受信できるようにします

<TextBox Height="23" HorizontalAlignment="Left" Margin="130,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=EmployeeFirstName, Mode=TwoWay}" />

次に、新しい従業員を作成するとき:

    public void AddEmployee()    
    {     
        Employee newEmployee = new Employee() {FName = this.EmployeeFirstName};    

        Employees.Add(newEmployee);    
        SelectedEmployee = newEmployee;    
    } 
于 2012-10-16T11:32:13.923 に答える
1

TwoWayバインド モードを使用する必要があります。たとえば、Text="{Binding Path=Employee.Fname,Mode=TwoWay}". Binding.Mode の詳細については、MSDN を参照してください。

于 2012-10-16T10:55:37.283 に答える
0

ビューモデルでそれぞれFname、Sname、Deptという名前の3つのプロパティを作成します..

private string _fname;
        public string Fname
        {
            get
            {
                return _fname;
            }
            set
            {
                _fname = value;
                RaisePropertyChanged("Fname");
            }
        }

そして、機能は次のとおりです..

public void AddEmployee()    
    {     
        Employee newEmployee = new Employee() {Fname=this.Fname;Sname=this.Sname;Dept=this.Dept};    

        Employees.Add(newEmployee);    
        SelectedEmployee = newEmployee;    
    } 

それはうまく機能します..

デザインコードは:

<TextBlock FontWeight="Bold" Height="26" HorizontalAlignment="Left" Margin="47,12,0,0" Name="textBlock1" Text="First Name:" VerticalAlignment="Top" Width="77" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Fname,Mode=TwoWay}" />
        <TextBlock FontWeight="Bold" Height="25" HorizontalAlignment="Left" Margin="35,44,0,0" Name="textBlock2" Text="Second Name:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,44,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=Sname,Mode=TwoWay}"/>
        <TextBlock FontWeight="Bold" Height="23" HorizontalAlignment="Left" Margin="45,75,0,0" Name="textBlock3" Text="Department:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,75,0,0" Name="textBox3" VerticalAlignment="Top" Width="120"  Text="{Binding Path=Dept,Mode=TwoWay}"/>

<Button Content="Show Message" Width="100" Height="25" Margin="256,75,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <si:CallDataMethod Method="AddEmployee"/>
                    <si:ShowMessageBox Caption="Thank you"
                                       Message="Thanks for trying the Example"
                                       MessageBoxButton="OK"/>
                    <si:SetProperty TargetName="LayoutRoot" 
            PropertyName="Background" Value="PaleGoldenrod"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

それが私たちに役立つことを願っています..

于 2012-10-16T12:57:04.163 に答える