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

Wpf 将单个控件绑定到多个属性,wpf,mvvm,Wpf,Mvvm,我目前正在开发一个WPF表单,并尝试应用MVVM模式。 我有一个数据网格,两个编辑控件和一个按钮。简化的代码如下所示: <syncfusion:SfDataGrid Grid.Row="1" Name="TempGrid" ItemsSource="{Binding TempProfile}" SelectedItem="{Binding SelectedTempSetpoint}"> </syncfusion:SfDataGrid> <syncfusion:Tim

我目前正在开发一个WPF表单,并尝试应用MVVM模式。 我有一个数据网格,两个编辑控件和一个按钮。简化的代码如下所示:

<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}">

每次更改datagrid中选定元素的值时,我都使用单向绑定来更新编辑控件的内容。但是,我希望能够更改编辑控件内的值,并使用这些值向datagrid添加另一个元素。为此,我希望使用按钮的Command属性(以及ViewModel中的DelegateCommand)。 通常,我会将编辑控件的值绑定到VM中的属性,但这样一来,如果SelectedElement发生更改,我将失去它们更新的功能。
正确的方法是什么?使用单独的属性并在VM中更新它们?或者有没有办法将控件绑定到多个属性

我能够通过模型和多值转换器的新特性实现这一点

代码如下:

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

公共类视图模型:INotifyPropertyChanged
{
私有ICommand addCommand;
公共ICommand AddCommand
{
获取{return addCommand;}
设置{addCommand=value;}
}
私有可观察集合名称;
公共可观测集合名称
{
获取{返回名称;}
设置{names=value;}
}
私有字符串selectedName;
私有字符串newName;
公共字符串新名称
{
获取{return newName;}
设置{newName=value;OnPropertyChanged(“newName”);}
}
公共字符串SelectedName
{
获取{返回selectedName;}
设置{selectedName=value;OnPropertyChanged(“selectedName”);}
}
公共事件属性更改事件处理程序属性更改;
公共视图模型()
{
名称=新的ObservableCollection();
名称。添加(“名称1”);
名称。添加(“名称2”);
addCommand=新的DelegateCommand(添加、添加);
}
私有布尔CanAdd(对象参数)
{
返回true;
}
专用无效添加(对象对象对象)
{
名称。添加(新名称);
}
受保护的虚拟void OnPropertyChanged(字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类CustomMultiConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
如果(值!=null)
{
如果(值[0]!=null)
返回值[0];
}
返回null;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
var obj=新对象[2];
obj[0]=null;
obj[1]=数值;
返回obj;
}
}

如果有任何错误,请纠正我。

我能够通过模型和多值转换器的新特性实现这一点

代码如下:

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

公共类视图模型:INotifyPropertyChanged
{
私有ICommand addCommand;
公共ICommand AddCommand
{
获取{return addCommand;}
设置{addCommand=value;}
}
私有可观察集合名称;
公共可观测集合名称
{
获取{返回名称;}
设置{names=value;}
}
私有字符串selectedName;
私有字符串newName;
公共字符串新名称
{
获取{return newName;}
设置{newName=value;OnPropertyChanged(“newName”);}
}
公共字符串SelectedName
{
获取{返回selectedName;}
设置{selectedName=value;OnPropertyChanged(“selectedName”);}
}
公共事件属性更改事件处理程序属性更改;
公共视图模型()
{
名称=新的ObservableCollection();
名称。添加(“名称1”);
名称。添加(“名称2”);
addCommand=新的DelegateCommand(添加、添加);
}
私有布尔CanAdd(对象参数)
{
返回true;
}
专用无效添加(对象对象对象)
{
名称。添加(新名称);
}
受保护的虚拟void OnPropertyChanged(字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类CustomMultiConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
如果(值!=null)
{
如果(值[0]!=null)
返回值[0];
}
返回null;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
var obj=新对象[2];
obj[0]=null;
obj[1]=数值;
返回obj;
}
}
如果有什么问题,请纠正我