将单个控件绑定到多个属性

时间:2016-12-21 11:05:32

标签: wpf mvvm

我目前正在开发一个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中更新它们?或者有没有办法将控件绑定到多个属性?

1 个答案:

答案 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;
    }
}

如果有任何问题,请纠正我。