Это имеет отношение, как привязка данных настраивается в dotnet платформе, особенно BindingContext
. На высоком уровне это означает, что, если Вы не определили иначе, каждая форма и все средства управления формы совместно используют тот же BindingContext
. Когда Вы установите DataSource
, свойство эти ComboBox
будет использовать BindingContext
для получения ConcurrenyMangager
, который обертывает список. Эти ConcurrenyManager
отслеживает такие вещи как текущее выбранное положение в списке.
, Когда Вы устанавливаете DataSource
из вторых ComboBox
, это будет использовать тот же BindingContext
(формы), который приведет к ссылке на тот же ConcurrencyManager
как выше используемого для установки привязки данных.
Для получения более подробного объяснения см. BindingContext.
Скрытие метода в интерфейсе не такое уж грубое; Я бы выбрал что-то вроде:
interface IBasicProps {
int Priority { get; }
string Name {get;}
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
new int Priority { get; set; }
new string Name { get; set; }
//... whatever
}
class Foo : IBasicPropsWriteable {
public int Priority {get;set;}
public string Name {get;set;}
/* optional
int IBasicProps.Priority {get {return Priority;}}
string IBasicProps.Name {get {return Name;}}
*/
}
Один из способов - просто пропустить наследование интерфейсов. Сделайте один интерфейс только для чтения и один только для записи и при необходимости реализуйте:
interface IBasicPropsReadable {
int Priority { get; }
string Name { get; }
}
interface IBasicPropsWriteable {
int Priority { set; }
string Name { set; }
}
class SomeClassReadWrite : IBasicPropsReadable, IBasicPropsWriteable {
int Priority { get; set; }
string Name { get; set; }
}
class SomeClassReadOnly : IBasicPropsReadable {
int Priority { get; }
string Name { get; }
}
Если ваша цель - чтобы было понятнее, когда чтение или запись разрешены, я бы использовал отдельные методы получения и установки, а не свойства.
interface IBasicProps {
int GetPriority();
string GetName();
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
void SetPriority(int priority);
void SetName(string name);
//... whatever
}
Вы можете оставить интерфейсы несвязанными и просто заставить ваш класс реализовывать оба интерфейса. Ведь интерфейсы просто определяют контракт, и контракты не нужно связывать. Кажется, это просто оптимизация для вас при кодировании, чтобы один доступный для записи был производным от другого, поэтому вам нужно указать только один интерфейс.
public interface IBasicProps
{
int Priority { get; }
string Name {get;}
//... whatever
}
public interface IBasicPropsWriteable
{
int Priority { get; set; }
string Name { get; set; }
//... whatever
}
public class Foo : IBasicProps, IBasicPropsWriteable
{
public int Priority { get; set; }
public string Name { get; set; }
// whatever
}
Если вам действительно нужна оптимизация, вы можете создать другой интерфейс, который является производным от обоих и пусть ваши классы реализуют это.
public interface IBasicPropsAll : IBasicProps, IBasicPropsWriteable { }
public class Foo : IBasicPropsAll
{
public int Priority { get; set; }
public string Name { get; set; }
// whatever
}