我目前正在开发一个WPF表单,我正在尝试应用MVVM模式。 我有一个datagrid,两个Edit-controls和一个Button。简化代码如下所示:
<syncfusion:SfDataGrid Grid.Row="1" Name="TempGrid" ItemsSource="{Binding TempProfile}" SelectedItem="{Binding SelectedTempSetpoint}">
</syncfusion:SfDataGrid>
<syncfusion:TimeSpanEdit Format="hh:mm" Value="{Binding SelectedTempSetpoint.Time, Mode=OneWay}" />
<syncfusion:UpDown Value="{Binding SelectedTempSetpoint.Value, Mode=OneWay}" >
<Button Content="Add" Command="{Binding AddTempSetpointCommand}">
我使用OneWay-Binding来更新Edit-Control的内容,每次更新数据网格中所选元素的时间或值。但是,我希望能够更改编辑控件内的值,并使用该值将另一个元素添加到datagrid。为此,我想使用Button的Command属性(以及ViewModel中的DelegateCommand)。 通常我会将编辑控件的值绑定到我的VM中的属性,但这样,如果SelectedElement更改,我将失去更新的功能。 这样做的正确方法是什么?使用单独的属性并在VM中更新它们?或者有没有办法将控件绑定到多个属性?
答案 0 :(得分:-1)
我能够使用Model和MultiValueConverter中的新属性实现此目的,
下面的代码,
<StackPanel>
<StackPanel.Resources>
<local:CustomMultiConverter x:Key="CustomMultiConverter"/>
</StackPanel.Resources>
<ListBox ItemsSource="{Binding Names}" SelectedItem="{Binding SelectedName}" />
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource CustomMultiConverter}">
<Binding Mode="OneWay" Path="SelectedName" />
<Binding Mode="TwoWay" Path="NewName" />
</MultiBinding>
</TextBox.Text>
</TextBox>
<Button Command="{Binding AddCommand}" Content="Add" />
</StackPanel>
public class ViewModel : INotifyPropertyChanged
{
private ICommand addCommand;
public ICommand AddCommand
{
get { return addCommand; }
set { addCommand = value; }
}
private ObservableCollection<string> names;
public ObservableCollection<string> Names
{
get { return names; }
set { names = value; }
}
private string selectedName;
private string newName;
public string NewName
{
get { return newName; }
set { newName = value; OnPropertyChanged("NewName"); }
}
public string SelectedName
{
get { return selectedName; }
set { selectedName = value;OnPropertyChanged("SelectedName"); }
}
public event PropertyChangedEventHandler PropertyChanged;
public ViewModel()
{
Names = new ObservableCollection<string>();
Names.Add("name1");
Names.Add("name2");
addCommand = new DelegateCommand(Add, CanAdd);
}
private bool CanAdd(object arg)
{
return true;
}
private void Add(object obj)
{
Names.Add(NewName);
}
protected virtual void OnPropertyChanged(string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class CustomMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if(values != null)
{
if (values[0] != null)
return values[0];
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
var obj = new object[2];
obj[0] = null;
obj[1] = value;
return obj;
}
}
如果有任何问题,请纠正我。